多个同名组定义或系统

时间:2012-02-25 23:03:26

标签: python regex

我第一次来这里,标题很糟糕,我知道:)。

嗯,这就是我想要做的事情

输入可能性1:SOMETHING BLAH always same words here (here comes date/time text, called group 1) [group 2 text]: (group 3 text) END

输入2:SOMETHING BLAH [group 2 text] always same words here (here comes date/time text, called group 1): (group 3 text) END

group2可以出现在

之前或之后

现在,使用python和模块re,是否可以仅使用1个正则表达式来匹配这些输入中的任何一个?

示例(显然,这样的事情是不可能的,因为它包含相同的名称组):

"SOMETHING BLAH (always same words here \((?P<group1>.{1,40})\) \[(?P<group2>.*?)\]: \((?P<group3>.*?)\)|\[(?P<group2>.*?)\] always same words here \((?P<group1>.{1,40})\): (group 3 text) ) END", re.DOTALL

这只是我尝试做的事情的一个例子

1 个答案:

答案 0 :(得分:0)

当然,您使用可选组:

>>> patt = re.compile("foo (?P<name>[0-9]+)?")
>>> patt.search("blah foo 999 bar").groupdict()
{'name': '999'}
>>> patt.search("blah foo bar").groupdict()
{'name': None}

你的例子,有点简化了长度:

prefix (?P<optional1>\[.*?\])? same-words \((?P<date>.*?)\)(?P<optional2> \[.*?\])?: \((?P<g3>.*?)\) END

然后,一旦你有匹配,你可以这样做:

d = patt.search(str).groupdict()
g2 = d["optional1"] if d["optional1"] is not None else d["optional2"]