Regex Problem Group Переопределение имени группы? - PullRequest
10 голосов
/ 12 декабря 2008

Итак, у меня есть это регулярное выражение:

(^(\s+)?(?P<NAME>(\w)(\d{7}))((01f\.foo)|(\.bar|\.goo\.moo\.roo))$|(^(\s+)?(?P<NAME2>R1_\d{6}_\d{6}_)((01f\.foo)|(\.bar|\.goo\.moo\.roo))$))

Теперь, если я попытаюсь сделать матч против этого:

B048661501f.foo

Я получаю эту ошибку:

  File "C:\Python25\lib\re.py", line 188, in compile
    return _compile(pattern, flags)
  File "C:\Python25\lib\re.py", line 241, in _compile
    raise error, v # invalid expression
sre_constants.error: redefinition of group name 'NAME' as group 9; was group 3

Если я не могу определить одну и ту же группу дважды в одном и том же регулярном выражении для двух разных случаев, что мне делать?

Ответы [ 3 ]

7 голосов
/ 12 декабря 2008

Нет, у вас не может быть двух групп с одинаковыми именами, это как-то бросает вызов цели, не так ли?

Что вы, вероятно, действительно хотите, это:

^\s*(?P<NAME>\w\d{7}|R1_(?:\d{6}_){2})(01f\.foo|\.(?:bar|goo|moo|roo))$

Я реорганизовал твоё регулярное выражение насколько это возможно. Я сделал следующие предположения:

Вы хотите (поправьте меня, если я ошибаюсь):

  • игнорировать пробелы в начале строки
  • сопоставить одно из следующих значений в группу с именем "NAME":
    • буква, за которой следуют 7 цифр или
    • "R1_" и два раза (6 цифр + "_")
  • сопровождается либо:
    • "01f.foo" или
    • "." и ("bar" или "goo" или "moo" или "roo")
  • с последующим концом строки

Вы могли бы также иметь в виду:

^\s*(?P<NAME>\w\d{7}01f|R1_(?:\d{6}_){2})\.(?:foo|bar|goo|moo|roo)$

Что такое:

  • игнорировать пробелы в начале строки
  • сопоставьте одно из следующих значений в группу с именем "NAME":
    • буква, за которой следуют 7 цифр и "01f"
    • "R1_" и два раза (6 цифр + "_")
  • точка
  • "foo", "bar", "goo", "moo" или "roo"
  • конец строки
6 голосов
/ 12 января 2013

Повторное использование того же имени имеет смысл в вашем случае, вопреки ответу Тамалака.

Ваше регулярное выражение компилируется с python2.7, а также с re2. Может быть, эта проблема была решена.

0 голосов
/ 26 мая 2019

Следующий ответ посвящен тому, как заставить приведенное выше регулярное выражение работать в Python3.

Поскольку модуль re2, предложенный Максом, не будет работать в Python3, из-за NameError: basestring. Другой альтернативой этому является модуль regex.

Модуль

regex - это просто расширенная версия re с дополнительными дополнительными функциями. это Модуль также позволяет иметь те же имена групп в регулярном выражении.

Вы можете установить его через:

sudo pip install regex

И если вы уже использовали re или re2 в своей программе. Просто сделайте следующее для импорта regex module

import regex as re
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...