Как создать регулярное выражение python типа "(. *)", так что, если "a (b) c (d) e" соответствует питону "b" вместо "b" c (d "?
Я знаю, что я могу использовать "[^)]" вместо ".", но я ищу более общее решение, которое сохраняет мое регулярное выражение немного чище. Есть ли способ сказать python "эй, сопоставьте это как можно скорее"?
Ответ 1
Ты ищешь всесильного "*?"
http://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy
не жадные квалификаторы *?, +?,?? или {m, n}? [...] сопоставляйте как можно меньше текста.
Ответ 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'