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