Python неживые регулярные выражения

Как создать регулярное выражение python типа "(. *)", так что, если "a (b) c (d) e" соответствует питону "b" вместо "b" c (d "?

Я знаю, что я могу использовать "[^)]" вместо ".", но я ищу более общее решение, которое сохраняет мое регулярное выражение немного чище. Есть ли способ сказать python "эй, сопоставьте это как можно скорее"?

Ответ 2

>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

В соответствии с документами:

Отборочные '*', '+' и '?' все жадные; они соответствуют как можно большему количеству текста. Иногда это поведение не требуется; если RE <.*> соответствует "<H1>title</H1>", он будет соответствовать всей строке, а не только "<H1>". Добавление '?' после того, как квалификатор заставит его выполнить матч не-жадным или минимальным образом; как можно меньше символов. Использование .*? в предыдущем выражении будет соответствовать только "<H1>".

Ответ 3

Не работает \\(.*?\\)? Это не жадный синтаксис.

Ответ 4

Как говорили другие, используя? модификатор в кванторе * будет решать вашу непосредственную проблему, но будьте осторожны, вы начинаете отклоняться в области, где регулярные выражения перестают работать, и вместо этого вам нужен синтаксический анализатор. Например, строка "(foo (bar)) baz" вызовет проблемы.

Ответ 5

Использование неровного соответствия - хорошее начало, но я также предлагаю вам пересмотреть любое использование .* - что об этом?

groups = re.search(r"\([^)]*\)", x)

Ответ 6

Вы хотите, чтобы он соответствовал "(b)"? Сделайте так, как предложили Зитракс и Паоло. Вы хотите, чтобы он соответствовал "b"? У

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'