Python: добавление двух регулярных выражений - PullRequest
0 голосов
/ 30 января 2019

У меня есть два регулярных выражения (альтернативно, их строки шаблона), и я хотел бы их объединить.

Это дано re1 и re2, я хотел бы построить re3, гдеre3 соответствует S, если re1 соответствует некоторому префиксу S, а затем re2 соответствует остатку.

Некоторые плохие идеи:

  1. Соответствие re1а затем re2 на остаток.Это невозможно, например, для /x*/ + /x/ в строке «xxx», поскольку жадное совпадение потребляет последние x.

  2. Добавить шаблоны.Это терпит неудачу, например, на /a|b/ + /c/, поскольку это приводит к /a|bc/, и | имеет более низкий приоритет, чем сцепление.

Некоторые лучшие идеи:

  1. Добавить шаблоны внутри групп без захвата.Это решает проблему приоритета;однако это неправильно обрабатывает обратные ссылки.В настоящее время это моя наименьшая плохая идея.

  2. "Откат вручную" путем перечисления всех способов, которыми re1 может соответствовать S, а затем re2 наостаток после матча.К сожалению, в Python, похоже, нет никакой поддержки для этого.

Какие-нибудь лучшие подходы?Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

Конкатенация регулярных выражений;на самом деле это одно из основных правил построения более сложных регулярных выражений из основ.Однако для этого может потребоваться явная скобка.

re1 = 'x*'
re2 = 'x'
# This works because 'x*x' and '(x*)x' are equivalent regular expressions
if re.match(re1 + re2, 'xxx'):
    print("Success!")

re1 = 'a|b'
re2 = 'c'
# Here, you need the parentheses because 'a|bc' and '(a|b)c' are not equivalent.
# "Parentheses" here means a non-capturing group.
if re.match("(?:%s)%s" % (re1, re2), "ac"):
    print("Success!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...