是否可以按任意顺序将多个可选正则表达式与字符串匹配(但可以按特定顺序检索?)
例如,
s ='(pattern1)(pattern2)(pattern3)'
这样
match = re.search(s, 'pattern2 pattern1')
match = re.search(s, 'pattern1 pattern3 pattern2')
match = re.search(s, 'pattern3 pattern1')
和其他所有排列匹配,此外
match.groups()
始终以相同的顺序返回pattern1
,pattern2
,pattern3
,即使有一个或多个None
我知道这听起来不太可能 - 只是想知道是否以及如何做到这一点。
答案 0 :(得分:1)
你的意思是
s = '(pattern1|pattern2|pattern3)'
match = sorted(re.findall(s, 'pattern1 pattern3 pattern2'))
match
>>> ['pattern1', 'pattern2', 'pattern3']
答案 1 :(得分:0)
第一步阅读itertools的文档,看看itertools magic会生成你想要的那种匹配项。例如
>>> import itertools
>>> a=['aaa','bbb','ccc']
>>> for q in itertools.permutations(a):
... print q
...
('aaa', 'bbb', 'ccc')
('aaa', 'ccc', 'bbb')
('bbb', 'aaa', 'ccc')
('bbb', 'ccc', 'aaa')
('ccc', 'aaa', 'bbb')
('ccc', 'bbb', 'aaa')
要确保以一致的方式返回匹配,请将正则表达式的每个部分标记为?P,例如
>>> rl=[]
>>> bigr=""
>>> for q in itertools.permutations(a):
... r=""
... for ms in q:
... r = r + "(?P<" + ms + ">" + ms + ")"
... rl.append(r)
...
>>> rl
['(?P<aaa>aaa)(?P<bbb>bbb)(?P<ccc>ccc)', '(?P<aaa>aaa)(?P<ccc>ccc)(?P<bbb>bbb)', '(?P<bbb>bbb)(?P<aaa>aaa)(?P<ccc>ccc)', '(?P<bbb>bbb)(?P<ccc>ccc)(?P<aaa>aaa)', '(?P<ccc>ccc)(?P<aaa>aaa)(?P<bbb>bbb)', '(?P<ccc>ccc)(?P<bbb>bbb)(?P<aaa>aaa)']
在上面的例子中,我使用匹配字符串作为表达式P部分的id标签。您可以生成“name1”“name2”或类似的
最后,将所有小正则表达式加入一个巨大的正则表达式
onegiantregexp = "|".join(rl)
使用re模块“groupdict”来获取结果
希望这有帮助