当前位置: 首页 > 面试题库 >

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

宗涵蓄
2023-03-14
问题内容

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

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,以便以后可以在同一模式中使用?换句话说,我可以在模式中重用子模式吗?


问题答案:

不可以,当使用标准库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模块不支持子例程模式。



 类似资料:
  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)

  • 我是正则表达式的初学者,并尝试搜索特定的数字模式。以下数据以 XML 格式嵌入。 要求是提取数据(最里面的列表)。在这个例子中,数据从24779开始到24760。注意:每次数据可能不是从“24”开始。因此,我计划通过以下逻辑提取:如果标签名(在本例中:DUT_1_PC)具有非零的有效数据,并且有效数据的计数大于100,用逗号分隔,则提取该列表及其标签名(DUT_1_PC)。 我无法提取所需的数据。

  • 但是抓住 以重复的方式?

  • 问题内容: 我需要这件事的帮助。查看以下正则表达式: 我想查找这样的词:“自制”,“ aaaa-bbb”而不是“ aaa-bbb”,而 不是 “ aaa–aa–aaa”。基本上,我想要以下内容: 单词-连字符-单词。 它适用于所有内容,但该模式会通过:“ aaa–aaa–aaa”,但不应通过。哪种正则表达式适用于此模式? 问题答案: 可以从表达式中删除反斜杠: 下面的代码应该工作 请注意,您可以使

  • 问题内容: 我想解决这个问题。 逗号:分割条款 双引号:字符串值(忽略特殊字符) 数组 例如: 输入: 预期输出: 但是我无法获得超越结果。 我写了下面的代码: 我的输出是: 我需要更改以获得预期的输出?我应该坚持使用正则表达式还是其他解决方案更灵活,更易于维护? 问题答案: 这个正则表达式可以达到目的: 它的工作原理是在逗号后添加一个用于匹配成对的方括号的预读-如果您 位于 方括号内,那么您当然