0

我有很多文件,我已将所有文件名保存到filelists.txt. 这是一个示例文件:

cpu_H1_M1_S1.out  
cpu_H1_M1_S2.out  
cpu_H2_M1_S1.out  
cpu_H2_M1_S2.out  

当程序在文件名中检测到_H,_M时。_S我需要输出之后出现的数字。例如:

_H     _M     _S  
1       1      1  
1       1      2  
2       1      1  
2       1      2  

谢谢你。

4

3 回答 3

2

您可以使用正则表达式:

>>> s = 'cpu_H2_M1_S2.out'
>>> re.findall(r'cpu_H(\d+)_M(\d+)_S(\d+)', s)
[('2', '1', '2')]

如果它与格式不完全匹配,您将得到一个空列表作为结果,可用于忽略结果。如果您愿意,可以调整它以将 str 转换为 int:

[int(i) for i in re.findall(...)]
于 2012-11-21T08:10:56.200 回答
0

像这样使用regex

In [13]: with open("filelists.txt") as f:
    for line in f:
        data=re.findall(r"_H\d+_M\d+_S\d+",line)
        if data:
            print [x.strip("HMS") for x in data[0].split("_")[1:]]
   ....:             
['1', '1', '1']
['1', '1', '2']
['2', '1', '1']
['2', '1', '2']
于 2012-11-21T08:09:58.057 回答
0

尽管我对正则表达式本身没有任何反对意见,但我认为这对于这个问题来说太过分了。这是一个更轻的解决方案:

five = operator.itemgetter(5)
seven = operator.itemgetter(7)
nine = operator.itemgetter(9)
with open("filelists.txt") as f:
    for line in f:
        return [(int(five(line)), int(seven(line)), int(nine(nine))) for line in f]

希望有帮助

于 2012-11-21T08:21:38.290 回答