【问题标题】:Regular Expression: Using backreference in matched times {n}?正则表达式:在匹配时间 {n} 中使用反向引用?
【发布时间】:2012-10-16 03:14:58
【问题描述】:

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

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

在正则表达式中,我们可以使用反向引用来匹配先前捕获的子模式。 例如,(.+) \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>

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

【问题讨论】:

  • 我无法在文档中找到解释为什么不允许这样做的地方,但我非常怀疑这是否会得到支持。 {} 是预期的数字,而不是组结果,这是你给它的——即使它最终返回一个数字。
  • 不,你不能。正则表达式应该解析正则语言
  • @JBernardo 应该,是关键词。通常,当您想查找 startend 具有相同单词的模式时,您将使用类似于 ^([a-z]+)(.*)\1$ 的内容,这本质上是 OP 正在尝试的完成,但在 {} 内代替。
  • @newfurniturey 不,不是。重复次数不能由语言本身任意选择
  • @JBernardo 后向引用不是在字面上重复匹配的表达式来代替后向引用吗?它与替代有何不同?

标签: python regex backreference


【解决方案1】:

有趣的想法,但我认为编译正则表达式时会处理“{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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多