Я худший для регулярных выражений в целом, но в 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 ответа
Одна из проблем заключается в том, что \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} } - это синтаксис для группы без захвата.
Я не уверен, какова ваша цель, но, похоже, вам интересно, что находится между каждым подчеркиванием, поэтому может быть проще разделить по нему:
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]
...
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.