1

我想使用正则表达式来匹配字符串列表:1a, 2aa, 3aaa... 其中字符串中的第一个数字表示该数字后面有多少个 a。

我本能地认为反向引用可能会有所帮助,但事实并非如此。

在 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>

这个功能是模块没有实现还是仅仅因为基本的正则表达式算法不能支持这个功能?

4

1 回答 1

0

有趣的想法,但我认为编译正则表达式时会处理“{n}”。

你可以这样做:

>>> import re
>>> text = '3aaa'
>>> m = re.search('(\d+)a', text)
>>> pat = '\d+a{%s}' % m.group(1)
>>> n = re.search(pat, text)
>>> n.group(0)
'3aaa'

如果你想排除像'3aaaaa'这样的模式,你应该在模式的末尾需要一个'\b'(Python让你输入'\b'):

pat = '\d+a{%s}\\b' % m.group(1)
于 2012-11-21T22:30:32.123 回答