1

注意:我正在使用 pypi正则表达式模块

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

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

如何检索<id>组匹配的所有时间?

例如,在以下文本中:

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

我应该能够检索以下值:

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

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

4

1 回答 1

1

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

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

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

请参阅此正则表达式演示。重点是使用额外的命名捕获组,我将其命名为idm,您可以使用任何名称。

请参阅Python 演示

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']]
于 2020-10-22T13:33:54.787 回答