Повторное использование части шаблона Regex
Рассмотрим эту (очень упрощенную) примерную строку:
1aw2,5cx7
Как вы можете видеть, это два значения digit/letter/letter/digit
, разделенные запятой.
Теперь я мог бы сопоставить это со следующим:
>>> from re import match
>>> match("\d\w\w\d,\d\w\w\d", "1aw2,5cx7")
<_sre.SRE_Match object at 0x01749D40>
>>>
Проблема заключается в том, что я должен написать \d\w\w\d
дважды. С небольшими узорами это не так плохо, но с более сложными регулярными выражениями, написав то же самое дважды, вы делаете окончательный шаблон огромным и громоздким. Это также кажется излишним.
Я попытался использовать именованную группу захвата:
>>> from re import match
>>> match("(?P<id>\d\w\w\d),(?P=id)", "1aw2,5cx7")
>>>
Но это не сработало, потому что он искал два вхождения 1aw2
, а не digit/letter/letter/digit
.
Есть ли способ сохранить часть шаблона, например \d\w\w\d
, поэтому его можно использовать последним в одном шаблоне? Другими словами, можно ли повторно использовать под-шаблон в шаблоне?
Ответы
Ответ 1
Нет, шаблоны регулярных выражений не могут быть "символизированы".
Вы всегда можете сделать это на Python, конечно
digit_letter_letter_digit = r'\d\w\w\d'
затем используйте форматирование строк для создания более крупного шаблона:
match("{0},{0}".format(digit_letter_letter_digit), inputtext)
Ответ 2
Вы можете использовать обозначение (?group-number)
, в вашем случае:
(\d\w\w\d),(?1)
он эквивалентен:
(\d\w\w\d),(\d\w\w\d)
Просто примечание: \w
включает \d
.
Ответ 3
Попробуйте использовать обратную ссылку, я считаю, что она работает примерно так, как показано ниже:
1aw2,5cx7
Вы можете использовать
(\d\w\w\d),\1
См. здесь для справки http://www.regular-expressions.info/backref.html
Ответ 4
Я был обеспокоен той же проблемой и написал этот фрагмент
import nre
my_regex=nre.from_string('''
a=\d\w\w\d
b={{a}},{{a}}
c=?P<id>{{a}}),(?P=id)
''')
my_regex["b"].match("1aw2,5cx7")
Из-за отсутствия более описательного имени я назвал частичные регулярные выражения как a
, b
и c
.
Доступ к ним так же просто, как {{a}}