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

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

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

6 ответов



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


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


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


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

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

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

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