考虑这个(非常简化的)示例字符串:
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)
注意:这适用于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)