用于匹配字母数字 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)]
我有一个格式为 [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)]