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



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



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

545   6  

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

    Ничего не найдено.