正则表达式匹配而不捕获字符串的某些部分

regex to match and not capture some part of the string

我正在尝试捕获可以在这样的字符串中的日期

'30 jan and 6 apr and 12 oct 2022'

我正在使用 python 正则表达式模块(它与 re 相同,但有 'overlapped' 选项)。我需要得到与此列表相同的最终结果

['30 jan 2022', '6 apr 2022', '12 oct 2022']

到目前为止这个表达式

regex.findall(r'(?:\d\d | \d )(?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec)(?:.*)20(?:\d\d)', d, overlapped=True)

我得到

['30 jan and 6 apr and 12 oct 2022', ' 6 apr and 12 oct 2022', '12 oct 2022']

提前致谢。

您可以使用列表理解和 2 个捕获组:

\b(\d+ (?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec))(?=.*\b(20\d\d))\b

看到一个regex demo and a Python demo

import re

pattern = r"\b(\d+ (?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec))(?=.*\b(20\d\d))\b"
s = r"30 jan and 6 apr and 12 oct 2022"

res = [' '.join(s) for s in re.findall(pattern, s)]
print(res)

输出

['30 jan 2022', '6 ap 2022', '12 oct 2022']

请注意 (?:.*)(?:\d\d) 不需要非捕获组,因为组本身在模式中没有任何意义。