用于解析文件名的python正则表达式

时间:2016-04-26 17:34:59

标签: regex python-2.7

我一般都是正则表达式中最糟糕的,但在python中......我需要帮助修复我的正则表达式来解析文件名,例如:

>>> from re import search, I, M
>>> x="/almac/data/vectors_puces_T12_C1_00_d2v_H50_corr_m10_70.mtx"
>>> for i in range(6):
...     print search(r"[vectors|pairs]+_(\w+[\-\w+]*[0-9]{0,4})([_T[0-9]{2,3}_C[1-9]_[0-9]{2}]?)(_[d2v|w2v|coocc\w*|doc\w*]*)(_H[0-9]{1,4})(_[sub|co[nvs{0,2}|rr|nc]+]?)(_m[0-9]{1,3}[_[0-9]{0,3}]?)",x, M|I).group(i)
... 

它提供以下输出:

vectors_puces_T12_C1_00_d2v_H50_corr_m10_70
puces_T
12_C1_00
_d2v
_H50
_corr

然而,我需要的是

vectors_puces_T12_C1_00_d2v_H50_corr_m10_70
puces
T12_C1_00
_d2v
_H50
_corr

我不知道到底出了什么问题。谢谢

2 个答案:

答案 0 :(得分:0)

一个问题是 \w也会匹配下划线,在这种情况下,您希望它们是pucesT12_C1_00之间的分隔符。将\w替换为A-Za-z\-。此外,您应该将下划线放在适当的保存组之间:

(?:vectors|pairs)_([A-Za-z\-]+[0-9]{0,4})_([T[0-9]{2,3}_C[1-9]_[0-9]{2}]?)...
                                     HERE^

适合我:

>>> import re
>>> re.search(r"(?:vectors|pairs)_([A-Za-z\-]+[0-9]{0,4})_([T[0-9]{2,3}_C[1-9]_[0-9]{2}]?)(_[d2v|w2v|coocc\w*|doc\w*]*)(_H[0-9]{1,4})(_[sub|co[nvs{0,2}|rr|nc]+]?)(_m[0-9]{1,3}[_[0-9]{0,3}]?)",x, re.M|re.I).groups()
('puces', 'T12_C1_00', '_d2v', '_H50', '_corr', '_m10_70')

我还将[vectors|pairs]替换为(?:vectors|pairs),我认为,这实际上意味着什么 - 匹配vectorspairs文字字符串(?:...)是非捕获组的语法。

答案 1 :(得分:0)

我不确定你的目标是什么,但你似乎对每个下划线之间的内容感兴趣,所以分开它可能更简单:

path, filename = os.path.split(x)
filename = filename.split('.')
fileparts = filename.split('_')

fileparts将成为此列表:

vectors
puces
T12
C1
00
d2v
H50
corr
m10
70

您可以验证/检查任何部分,例如if fileparts[0] == 'vectors'tpart = fileparts[2:4] ...