Повторное использование части шаблона 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}}