重用正则表达式的一部分

iCo*_*dez 18 python regex

考虑这个(非常简化的)示例字符串:

1aw2,5cx7
Run Code Online (Sandbox Code Playgroud)

如您所见,它是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>
>>>
Run Code Online (Sandbox Code Playgroud)

问题是,我必须写\d\w\w\d两次.对于小图案,这并不是那么糟糕,但是,对于更复杂的正则表达式,两次写完全相同的东西会使得结束模式变得庞大而且繁琐.这似乎也是多余的.

我尝试使用命名捕获组:

>>> from re import match
>>> match("(?P<id>\d\w\w\d),(?P=id)", "1aw2,5cx7")
>>>
Run Code Online (Sandbox Code Playgroud)

但它没有用,因为它正在寻找两次1aw2,而不是digit/letter/letter/digit.

是否有任何方法可以保存模式的一部分,例如\d\w\w\d,因此可以在同一模式中使用后者?换句话说,我可以在模式中重用子模式吗?

Mar*_*ers 12

不,正则表达式模式不能"符号化".

当然,你总是可以在Python中这样做

digit_letter_letter_digit = r'\d\w\w\d'
Run Code Online (Sandbox Code Playgroud)

然后使用字符串格式来构建更大的模式:

match(r"{0},{0}".format(digit_letter_letter_digit), inputtext)
Run Code Online (Sandbox Code Playgroud)


Tot*_*oto 5

注意:这适用于PyPi regex模块,不适用于re模块。

(?group-number)在这种情况下,您可以使用符号:

(\d\w\w\d),(?1)
Run Code Online (Sandbox Code Playgroud)

它等效于:

(\d\w\w\d),(\d\w\w\d)
Run Code Online (Sandbox Code Playgroud)

请注意,\w其中包括\d。正则表达式将是:

(\d[a-zA-Z]{2}\d),(?1)
Run Code Online (Sandbox Code Playgroud)

  • [PyPi regex模块](https://pypi.python.org/pypi/regex)可以识别它。 (3认同)