Python, регулярные выражения, именованные группы и оператор «логический или» - PullRequest
5 голосов
/ 24 мая 2009

В регулярном выражении python именованные и безымянные группы определяются с помощью '(' и ')'. Это приводит к странному поведению. Regexp

"(?P<a>1)=(?P<b>2)"

, используемый с текстом "1 = 2", найдет именованную группу "a" со значением "1" и именованную группу "b" со значением "2". Но если я хочу использовать логический оператор или оператор и объединить несколько правил, следующее регулярное выражение:

"((?P<a>1)=(?P<b>2))|(?P<c>3)"

, используемый с тем же текстом "1 = 2", найдет группу без имени со значением "1 = 2". Я понял, что механизм регулярных выражений обрабатывает "(" и ")", который включает группы "a" и "b", как неназванную группу и сообщает, что она найдена. Но я не хочу, чтобы о неназванных группах сообщали, я просто хочу использовать "|" чтобы "склеить" несколько регулярных выражений вместе. Без создания каких-либо паразитических неназванных групп. Это способ сделать это в Python?

1 Ответ

13 голосов
/ 24 мая 2009

Используйте (?:), чтобы избавиться от неназванной группы:

r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)"

Из документации re :

(?: ...) Не группирующая версия обычные скобки. Совпадает с чем угодно регулярное выражение внутри круглые скобки, но подстрока соответствует группа не может быть восстановлена ​​после выполнение матча или ссылка позже в шаблоне.

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

r"(?P<a>1)=(?P<b>2)|(?P<c>3)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...