Я худший для регулярных выражений в целом, но в 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
Nacho 26 Апр 2016 в 20:34

2 ответа

Лучший ответ

Одна из проблем заключается в том, что \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, {{X4} } - это синтаксис для группы без захвата.

0
alecxe 26 Апр 2016 в 17:43

Я не уверен, какова ваша цель, но, похоже, вам интересно, что находится между каждым подчеркиванием, поэтому может быть проще разделить по нему:

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

0
Matt S 26 Апр 2016 в 18:09