重用正则表达式模式的一部分

user2555451:

考虑以下(非常简化的)示例字符串:

1aw2,5cx7

如您所见,它是两个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>
>>>

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

我尝试使用命名捕获组:

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

但这没用,因为它寻找的是两次1aw2,而不是digit/letter/letter/digit

有什么方法可以保存模式的一部分,例如\d\w\w\d,以便以后可以在同一模式中使用它吗?换句话说,我可以在模式中重用子模式吗?

马丁·彼得斯(Martijn Pieters):

不可以,当使用标准库re模块时,正则表达式模式不能被“符号化”。

当然,您始终可以通过重新使用Python变量来做到这一点:

digit_letter_letter_digit = r'\d\w\w\d'

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

match(r"{0},{0}".format(digit_letter_letter_digit), inputtext)

或者,使用Python 3.6+ f字符串:

dlld = r'\d\w\w\d'
match(fr"{dlld},{dlld}", inputtext)

我经常使用这种技术从可重复使用的子模式中组成更大,更复杂的模式。

如果您准备安装外部库,则该regex项目可以通过regex子例程调用解决此问题该语法(?<digit>)重新使用了已使用(隐式编号)捕获组的模式:

(\d\w\w\d),(?1)
^........^ ^..^
|           \
|             re-use pattern of capturing group 1  
\
  capturing group 1

您可以对命名捕获组执行相同的操作,其中(?<groupname>...)命名组groupname(?&groupname)(?P&groupname)(?P>groupname)重复使用匹配的模式groupname(后两种形式是与其他引擎兼容的替代方式)。

最后,regex支持该(?(DEFINE)...)块“定义”子例程模式,而无需在该阶段实际匹配任何子例程。你可以把多个(..)(?<name>...)捕获组在结构,以后来指他们在实际的模式:

(?(DEFINE)(?<dlld>\d\w\w\d))(?&dlld),(?&dlld)
          ^...............^ ^......^ ^......^
          |                    \       /          
 creates 'dlld' pattern      uses 'dlld' pattern twice

明确地说:标准库re模块不支持子例程模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式:匹配模式,更改其中的一部分

有没有办法在C ++正则表达式中重用模式的一部分?

通过bash正则表达式模式作为awk中较大正则表达式模式的一部分

正则表达式:是否可以使用“ |” 仅匹配模式的一部分?

在正则表达式模式匹配后删除匹配器的一部分

正则表达式匹配模式但只替换 R 中匹配的一部分

正则表达式-检查子字符串是否不是模式的一部分

正则表达式具有特定模式的字符串的一部分

正则表达式:提取字符串的一部分,消除它的特定模式

Java 正则表达式忽略/注释掉正则表达式的一部分

加号(+)是基本正则表达式的一部分吗?

正则表达式选择字符串的一部分

使用正则表达式替换字符串的一部分

正则表达式选择匹配项的一部分

仅使用正则表达式匹配网址的一部分

什么是正则表达式只返回 URL 的最后一部分

如何使用正则表达式跳过String的一部分?

正则表达式匹配字符串的一部分

如何使用正则表达式删除文本的这一部分?

正则表达式不匹配字符串的一部分

否定正则表达式的一部分(制表和单词)?

否定正则表达式的一部分

如何仅替换以下正则表达式(JavaScript)的一部分?

如何使用grep排除正则表达式的一部分

提取正则表达式匹配项的一部分

如何使正则表达式的一部分可选?

用sed替换匹配的正则表达式的一部分

正则表达式,选择其他文本内部的一部分

使用正则表达式获取匹配值的一部分