Python regex-игнорировать скобки как индексирование?

в настоящее время я написал шаблон регулярного выражения nooby, который включает чрезмерное использование символов "(" и")", но я использую их для операторов "или", таких как (A|B|C), что означает A или B или C.

мне нужно найти каждое совпадение шаблона в строке.
Попытка использовать re.findall(pattern, text) метод не годится, поскольку он интерпретирует символы скобок как индексирующие означающие (или любой правильный жаргон), и поэтому каждый элемент созданного списка не является строкой, показывающей сопоставленные текстовые разделы, но вместо этого Кортеж (которые содержат очень уродливые фрагменты совпадения шаблонов).

есть ли аргумент, который я могу передать findall игнорировать paranthesis как индексация?
Или мне придется использовать очень уродливую комбинацию re.search и re.sub

(это единственное решение, которое я могу придумать; найти индекс re.поиск, добавить соответствующий раздел текста в список, а затем удалить его из исходной строки {с помощью ugly index tricks}, продолжая это до тех пор, пока не закончатся спички. Очевидно, это ужасно и нежелательно).

спасибо!

2 ответов


да, добавьте ?: к группе, чтобы сделать его не-захвата.

import re
print re.findall('(.(foo))', "Xfoo")   # [('Xfoo', 'foo')]
print re.findall('(.(?:foo))', "Xfoo") # ['Xfoo']

посмотреть синтаксис re для получения дополнительной информации.


re.findall(r"(?:A|B|C)D", "BDE")

или

re.findall(r"((?:A|B|C)D)", "BDE")