组合具有相同命名组的正则表达式

2024-10-01 11:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试组合几个正则表达式来匹配日期。你知道吗

例如,我有

regex1:(内部有3个组,分别是'month'、'day'、'year')

(?:(?P<month>\d{1,2})[/-](?P<day>\d{1,2})[/-](?P<year>\d{2,4}))

regex2:(内部还有3个组)

(?P<day>\d{1,2}) (?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z.]*[,.]? (?P<year>\d{4})

还有很多其他正则表达式。你知道吗

我已经一个接一个地测试过了。现在我想把它们组合成一个正则表达式,它们之间有很多“|”。你知道吗

我试过:

import re
regexes = re.compile('regex1 here |'
                     'regex2 here |'
                     'regex3 here')

但它返回的错误如下:

redefinition of group name 'month' as group 4; was group 1 at position 59

我猜同名组只能出现一次?你知道吗

那么,如何将所有这些正则表达式与命名组组合成一个正则表达式呢?你知道吗


Tags: reheregroupyearaprjunmarmay
1条回答
网友
1楼 · 发布于 2024-10-01 11:36:27

解决这个问题的关键是使用一个branch reset group,它以(?|开头,本身就是一个非捕获组。你知道吗

括号内的每个备选方案对其捕获组使用相同的数字。这也适用于命名捕获组,只要具有相同名称的组具有相同的索引,或者两者都是非命名组。你知道吗

但是,要使用此PCRE功能,必须使用Python的替代regex引擎:

import regex as re
regex = r"(?|(?:(?P<month>\d{1,2})[\/-](?P<day>\d{1,2})[\/-](?P<year>\d{2,4}))|(?P<day>\d{1,2}) (?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z.]*[,.]? (?P<year>\d{4}))"

附言:我没有检查你的模式太多,但正如其他人暗示有改进的空间。但这是另一个问题。你知道吗

相关问题 更多 >