Не жадные регулярные выражения 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)'The'
*','+' и '?' квалификаторы все жадные; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE<.*>сравнивается с '<H1>title</H1>', он будет соответствовать всей строке, а не только '<H1>'. Добавление'?' после того, как квалификатор заставляет его выполнять матч не жадным или минимальным способом; как можно меньше символов будет сопоставлено. С помощью.*?в предыдущем выражении будет соответствовать только '<H1>'.
как другие сказали, используя ? модификатор на кванторе * решит вашу непосредственную проблему, но будьте осторожны, вы начинаете уходить в области, где регулярные выражения перестают работать, и вместо этого вам нужен парсер. Например, строка "(foo (bar)) baz" вызовет у вас проблемы.
вы хотите, чтобы он соответствовал "(b)"? Делай, как Zitrax и Паоло предложил. Вы хотите, чтобы он соответствовал "b"? Делай
>>> x = "a (b) c (d) e" >>> re.search(r"\((.*?)\)", x).group(1) 'b'
использование ungreedy match-хорошее начало, но я также предлагаю вам пересмотреть любое использование
.*-- Как насчет этого?groups = re.search(r"\([^)]*\)", x)
Comments