我第一次来这里,标题很糟糕,我知道:)。
嗯,这就是我想要做的事情
输入可能性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
这只是我尝试做的事情的一个例子
答案 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"]