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

时间:2018-05-06 03:18:22

标签: python regex

我尝试将几个正则表达式组合起来以匹配日期。

例如,我有

regex1 :(里面有3组,分别是'月','天','年')

is/my/path/to/file.jpg

regex2 :(里面还有3组)

(?:(?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}) ”。

我试过了:

|

但它返回错误,如:

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

我的猜测是,具有相同名称的组只能出现一次?

那么,如何将所有这些正则表达式与命名组合并为一个?

1 个答案:

答案 0 :(得分:1)

解决此问题的关键是使用以(?|开头的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}))"
PS:我没有多多检查你的模式,但正如其他人暗示的那样,还有改进的余地。但这是另一个问题。