如何从字符串中提取某些元素?

时间:2012-11-21 08:03:07

标签: python python-2.7

我有很多文件,我已将所有文件名保存到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  

谢谢。

3 个答案:

答案 0 :(得分: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(...)]

答案 1 :(得分: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']

答案 2 :(得分: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]

希望有所帮助