【问题标题】:Retrieve every times a group matched每次匹配组时检索
【发布时间】:2023-03-15 10:52:01
【问题描述】:

注意:我正在使用 pypi regex 模块

我有以下正则表达式模式(标志V1 + VERBOSE):

(?(DEFINE)
  (?P<id>[\d-]+)
)
id:\s(?&id)(,\s(?&id))*

如何检索&lt;id&gt; 组匹配的所有时间?

例如,在以下文本中:

不匹配此日期:2020-10-22,但匹配此 ID:5668-235 以及这些 ID:7788-58-2、8688-25、74-44558

我应该能够检索以下值:

["5668-235", "7788-58-2", "8688-25", "74-44558"]

请注意 this regex 匹配模式,但我想在每次匹配特定组时检索(即使它在同一个匹配对象中多次)。

【问题讨论】:

  • 用捕获组包裹它。
  • 即使使用捕获组,在 &lt;id&gt; 模式重复的情况下,如最后一个,不会返回中间匹配,如本例中:regex101.com/r/fDcvJF/3
  • 不要看 regex101 results,它不支持 PyPi 正则表达式库,看我的回答。特别是this demo.

标签: python-3.x regex pypi-regex


【解决方案1】:

DEFINE 块中使用的命名捕获组稍后在模式中用作构建块,当在消费模式部分使用时,它们实际上并不捕获它们匹配的文本。

在这种特殊情况下,您可以使用

(?(DEFINE)
  (?P<id>[\d-]+)
)
id:\s+(?P<idm>(?&id))(?:,\s+(?P<idm>(?&id)))*

this regex demo。重点是使用额外的命名捕获组,我将其命名为idm,您可以使用任何名称。

Python demo

import regex
pat = r'''(?(DEFINE)
  (?P<id>[\d-]+)
)
id:\s+(?P<idm>(?&id))(?:,\s+(?P<idm>(?&id)))*'''
text = r"don't match this date: 2020-10-22 but match this id: 5668-235 as well as these id: 7788-58-2, 8688-25, 74-44558"
print( [x.captures("idm") for x in regex.finditer(pat, text, regex.VERBOSE)] )
# => [['5668-235'], ['7788-58-2', '8688-25', '74-44558']]

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多