用于匹配字母数字 ID 和总和索引的 RegEx 表达式

RegEx expression to match alphanumeric ID and sum index

我有一个格式为 [alphanumeric]_[integer].wav 的文件目录,例如,

gdg36dhd3d_0.wav
gdg36dhd3d_1.wav
gdg36dhd3d_2.wav
344fikuo4q_0.wav
344fikuo4q_1.wav

字母数字是 ID,第二个数字是索引。以下代码应遍历文件名列表并对每个 ID 的索引求和,然后绘制数据的 histplot

 # sum the number of isolated events for every original sample
 number_isolated_events = list()
 for k, g in itertools.groupby(isolated_filenames, key=lambda x:re.search('(\w+)_', x).group(1)):
     number_events = len(list(g))
     number_isolated_events.append(number_events)

 sns.histplot(number_isolated_events, kde=True, color='b')

然而,当上述代码为运行并且isolated_filenames中有20个项目时,histplot看起来像这样:

计数为 1.0,我假设这意味着只有一个文件名与 RegEx 表达式 '(\w+)_'.

匹配

x 轴还显示索引总数 合并。我假设每个 ID 最多不超过 6 个索引。我的猜测是,所有索引都已汇总并与第一个文件名相关联,而不是以某种方式与它们各自的文件名相关联。是我的 RegEx 表达式有问题还是有更好的方法来实现我正在寻找的东西?

您可以使用

import itertools
isolated_filenames = ['gdg36dhd3d_0.wav','gdg36dhd3d_1.wav','gdg36dhd3d_2.wav','344fikuo4q_0.wav','344fikuo4q_1.wav']
l = [(x.rsplit('_')[0], x.rsplit('_')[-1][:-4]) for x in isolated_filenames]
number_isolated_events = []
for k, g in itertools.groupby(l, key=lambda x: x[0]):
    number_isolated_events.append(tuple([k, len(list(g))])) # if you need to count group items
    #number_isolated_events.append(tuple([k, sum(int(z[1]) for z in g)])) # if you need to sum numeric suffixes

print(number_isolated_events)

Python demo。输出:

[('gdg36dhd3d', 3), ('344fikuo4q', 2)]

备注:

  • [(x.rsplit('_')[0], x.rsplit('_')[-1][:-4]) for x in isolated_filenames]_ 之前创建文件部分列表,在 .wav 扩展名之前创建 _ 之后的数字(我假设这里的每个文件都有 .wav 扩展)
  • itertools.groupby(l, key=lambda x: x[0]) 按文件“root”名称分组(不带数字后缀)
  • len(list(g)) 获取每个键找到的项目的长度
  • sum(int(z[1]) for z in g) 对每个文件的数字后缀求和。

如果您愿意使用外部库,则使用 NumPy 的另一种解决方案:

import numpy as np

isolated_filenames = [
  "gdg36dhd3d_0.wav", "gdg36dhd3d_1.wav", "gdg36dhd3d_2.wav", "344fikuo4q_0.wav", "344fikuo4q_1.wav",
]

isolated_filenames = [file_name.split("_")[0] for file_name in isolated_filenames]
number_isolated_events = list(zip(*np.unique(isolated_filenames, return_counts=True)))

print(number_isolated_events)

输出:

[('344fikuo4q', 2), ('gdg36dhd3d', 3)]