我一般都是正则表达式中最糟糕的,但在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
我不知道到底出了什么问题。谢谢
答案 0 :(得分:0)
一个问题是 \w
也会匹配下划线,在这种情况下,您希望它们是puces
和T12_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)
,我认为,这实际上意味着什么 - 匹配vectors
或pairs
文字字符串(?:...)
是非捕获组的语法。
答案 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]
...