正则表达式匹配而不捕获字符串的某些部分
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)
不需要非捕获组,因为组本身在模式中没有任何意义。
我正在尝试捕获可以在这样的字符串中的日期
'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)
不需要非捕获组,因为组本身在模式中没有任何意义。