【问题标题】:Python: Using same named capture group multiple times in one regexPython:在一个正则表达式中多次使用相同命名的捕获组
【发布时间】:2020-07-15 12:16:11
【问题描述】:

是否可以使用 Python 在一个正则表达式中多次重复命名捕获组?

下面是正则表达式(这是不正确的,因为在同一个正则表达式中有重复的命名组)

regex = r'''Use ((?P<phn_num>(?<=(Phone: ))\d{10})?(?P<lndln_num>(?<=(landline: ))\d{10})?) 
or you can also use
((?P<phn_num>(?<=(Phone: ))\d{10})?(?P<lndln_num>(?<=(Landline: ))\d{10})?)'''

输入字符串将是以下之一:

 1. Use Phone: 1234567890 or you can also use Landline: 0012345678
 2. Use Landline: 0012345678 or you can also use Phone: 1234567890

目标是让一个正则表达式将phn_numlndln_num 捕获为命名捕获组(如果将上述任何字符串作为输入)。

【问题讨论】:

  • 试试这个Use (?:Phone: (?P&lt;phn_num&gt;\d{10})|landline: (?P&lt;lndln_num&gt;\d{10}))regex101.com/r/9Z3uvs/1
  • “使用”和“或者你也可以使用”是字符串的一部分吗?
  • @Austin,是的,它是字符串的一部分
  • 是的,它很有帮助,我用它来解决这个问题..谢谢..

标签: python regex


【解决方案1】:

该模式未锚定,因此您可以使用替换 | 而不是使用两个命名的捕获组来匹配两个变体。

使用不区分大小写的匹配:

\bUse (?:Phone: (?P<phn_num>\d{10})|landline: (?P<lndln_num>\d{10}))
  • \bUse Match Use 前面加上一个单词边界并匹配一个空格
  • (?: 交替的非捕获组
    • Phone: (?P&lt;phn_num&gt;\d{10}) 匹配 phone: 和 10 位数字
    • |或者
    • landline: (?P&lt;lndln_num&gt;\d{10}) 匹配 landline: 和 10 位数字
  • )

Regex demo

【讨论】:

  • “模式未锚定”是什么意思?此外,您编写的模式并没有捕获这两个组。它捕获其中一个,以先到者为准。
  • @Dhananjay_Goratela 我的意思是你可以获得多个部分匹配。例如,如果您使用锚点 ^ 来断言字符串的开头,您将只能获得字符串中的第一个结果。见regex101.com/r/GTkPA3/1 和关于锚点regular-expressions.info/anchors.html
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2014-10-27
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2022-07-16
  • 1970-01-01
相关资源
最近更新 更多