Python:根据公共名称标识符对文件名列表进行分组

Python:根据公共名称标识符对文件名列表进行分组,python,regex,parsing,Python,Regex,Parsing,在目录中,我有一些文件: temperature_Resu05_les_spec_r0.0300.0 temperature_Resu05_les_spec_r0.0350.0 temperature_Resu05_les_spec_r0.0400.0 temperature_Resu05_les_spec_r0.0450.0 temperature_Resu06_les_spec_r0.0300.0 temperature_Resu06_les_spec_r0.0350.0 temperatu

在目录中,我有一些文件:

temperature_Resu05_les_spec_r0.0300.0
temperature_Resu05_les_spec_r0.0350.0
temperature_Resu05_les_spec_r0.0400.0
temperature_Resu05_les_spec_r0.0450.0
temperature_Resu06_les_spec_r0.0300.0
temperature_Resu06_les_spec_r0.0350.0
temperature_Resu06_les_spec_r0.0400.0
temperature_Resu06_les_spec_r0.0450.0
temperature_Resu07_les_spec_r0.0300.0
temperature_Resu07_les_spec_r0.0350.0
temperature_Resu07_les_spec_r0.0400.0
temperature_Resu07_les_spec_r0.0450.0
temperature_Resu08_les_spec_r0.0300.0
temperature_Resu08_les_spec_r0.0350.0
temperature_Resu08_les_spec_r0.0400.0
temperature_Resu08_les_spec_r0.0450.0
temperature_Resu09_les_spec_r0.0300.0
temperature_Resu09_les_spec_r0.0350.0
temperature_Resu09_les_spec_r0.0400.0
temperature_Resu09_les_spec_r0.0450.0
我需要一个与
\u rXXXX
中具有相同标识符XXXX的所有文件的列表。例如,一份这样的清单将由

temperature_Resu05_les_spec_r0.0300.0
temperature_Resu06_les_spec_r0.0300.0
temperature_Resu07_les_spec_r0.0300.0
temperature_Resu08_les_spec_r0.0300.0
temperature_Resu09_les_spec_r0.0300.0

我不知道XXXX值是什么,所以我不能遍历它们并像那样匹配。我想这最好是用正则表达式来处理。有什么想法吗?

是的,正则表达式是一种有趣的方法!它可能看起来像这样:

results = {}
for fname in fnames:
    id = re.search('.*_r(.*)', fname).group(1) # grabs whatever is after the final "_r" as an identifier
    if id in results:
         results[id] += fname
    else:
         results[id] = [fname]
结果将存储在字典中,
results
,由id索引


我应该补充一点,只要所有文件名都具有可靠的_rXXXX结构,这种方法就可以工作。如果文件名可能与该模式不匹配,则必须检查它并采取相应的措施。

不,正则表达式不是最好的方法,您的模式非常简单,只需在
\r
上str.rsplit,并使用拆分的正确元素作为键对数据进行分组。A将有效地进行分组:

from collections import defaultdict

with open("yourfile") as f:
    groups = defaultdict(list)
    for line in f:
        groups[line.rsplit("_r",1)[1]].append(line.rstrip())

from pprint import pprint as pp

pp(groups.values())
对于您的样品,您将获得:

[['temperature_Resu09_les_spec_r0.0450.0'],
 ['temperature_Resu05_les_spec_r0.0300.0',
  'temperature_Resu06_les_spec_r0.0300.0',
  'temperature_Resu07_les_spec_r0.0300.0',
  'temperature_Resu08_les_spec_r0.0300.0',
  'temperature_Resu09_les_spec_r0.0300.0'],
 ['temperature_Resu05_les_spec_r0.0400.0',
  'temperature_Resu06_les_spec_r0.0400.0',
  'temperature_Resu07_les_spec_r0.0400.0',
  'temperature_Resu08_les_spec_r0.0400.0',
  'temperature_Resu09_les_spec_r0.0400.0'],
 ['temperature_Resu05_les_spec_r0.0450.0',
  'temperature_Resu06_les_spec_r0.0450.0',
  'temperature_Resu07_les_spec_r0.0450.0',
  'temperature_Resu08_les_spec_r0.0450.0'],
 ['temperature_Resu05_les_spec_r0.0350.0',
  'temperature_Resu06_les_spec_r0.0350.0',
  'temperature_Resu07_les_spec_r0.0350.0',
  'temperature_Resu08_les_spec_r0.0350.0',
  'temperature_Resu09_les_spec_r0.0350.0']]

谢谢嗯,什么时候更喜欢正则表达式?我想知道它是否值得学习,因为似乎总是有一个更简单的方法!出于好奇,你是从哪里学会这些方法的!?我发现它们非常有用,但我从来没有遇到过这个默认的dict。谢谢你的回答。谢谢你,我最终还是选择了“更简单”的方法!