2012-11-21 54 views
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 

谢谢。

+1

什么范围内的数字你要选择,为H,M和S?另外,你的问题是不明确的。请发布你已经尝试过的所以我们可以找出你想要做什么 – inspectorG4dget

+0

所有的文件名都有'_H','_M','_S'吗?如果缺少什么东西呢? –

+0

这些数字是WEKA中使用的参数。 我想要这些数字来创建一个报告。 – ikwangz

回答

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

你可以使用正则表达式:

>>> 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(...)] 
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] 

希望帮助

相关问题