Я хочу использовать регулярное выражение для соответствия списку строк: 1a
, 2aa
, 3aaa
... где первая цифра в строке обозначает, сколько букв а следует за этой цифрой.
Интуитивно я думаю, что обратная ссылка может помочь, но это неправда.
В Regex мы можем использовать обратную ссылку для сопоставления с ранее захваченным подшаблоном. Например, (.+) \1
соответствует aaa aaa
.
Могу ли я использовать обратную ссылку во временах совпадения с шаблоном {n}
, {n,m}
или {n,}
?
Например, \da{\1}
в идеале соответствовало бы 3aaa
, однако я проверил это с модулем сборки python re
, это не работает. Кажется, компилятор понимает \da{\1}
как другой литерал:
>>> re.compile('\da{\1}', re.DEBUG)
in
category category_digit`
literal 97
literal 123
literal 1
literal 125
<_sre.SRE_Pattern object at 0xb7726790>
>>> re.compile('\da{1}', re.DEBUG)`
in
category category_digit
max_repeat 1 1
literal 97
<_sre.SRE_Pattern object at 0xb7707820>
Эта функция не реализована модулем или просто потому, что эта функция не может поддерживаться базовым алгоритмом регулярных выражений?
{}
- это ожидаемые цифры, а не групповой результат, который вы ему даете, хотя в конечном итоге он возвращает число. - person jdotjdot   schedule 16.10.2012^([a-z]+)(.*)\1$
, что, по сути, и пытается выполнить OP, но внутри{}
вместо этого. - person newfurniturey   schedule 16.10.2012\da{\1}
, но шаблон в(.+) \1
тоже. Так как же это влияет на реализацию алгоритма? Я думаю, что\da{\1}
точно такой же, как(.+) \1
с точки зрения реализации. - person crsxl   schedule 16.10.2012re.compile('\da{\1}', re.DEBUG)
и посмотрите, что получится. Он интерпретирует{
и}
как литералы (как если бы перед ними стояла обратная косая черта), а не как специальные. Сравните сre.compile('\da{1}', re.DEBUG)
. - person   schedule 16.10.2012