2015-08-12 3 views
2

У меня есть следующий Python регулярное выражение:!Python Regular Expression - Названная группа не полностью Matching

(?P<key>.*)(?P<operator><=>|=|>=|>|<=|<|!=|<>)(?P<value>.*) 

и моя строка ввода пример является: это = что, но = не получает соответствует как группа:

{u'operator': '=', u'key': 'this!', u'value': 'that'} 

Можете ли вы помочь мне матч против полного оператора = в этом примере, используя выше шаблон регулярного выражения с! какое объяснение, почему мой оригинальный шаблон не сработал? Заранее спасибо!

ответ

4

Вы должны использовать ленивые соответствие с ударной первой группой, в противном случае, .* будет «съедать» первый символ, так как он жадный и может также соответствовать любым символам в ваших альтернативах:

(?P<key>.*?)(?P<operator><=>|!=|>=|<=|<>|[=><])(?P<value>.*) 

См demo

Я также перестроил альтернативы, чтобы они шли от самого длинного к кратчайшему. Это может быть важно, так как regex обрабатывает слева направо, и поэтому мы должны сначала проверить самый длинный вариант.

И последние три альтернативы могут быть сжаты в класс символов [=><], чтобы уменьшить обратную трассировку.

+0

Я смотрел на ленивые/жадные темы в документации, но я не мог понять, как применить его к моему регулярному выражению. Спасибо за фрагмент кода и объяснение! –

+0

Добро пожаловать. Просто убедитесь, что вы не обрабатываете длинную строку ввода с этим регулярным выражением. Кроме того, если у вас есть символы новой строки, используйте 're.S' при компиляции регулярного выражения или добавьте' (? S) 'в начале шаблона регулярного выражения. –