第一步阅读 itertools 的文档,看看 itertools 的魔法会生成你想要的匹配集。例如
>>> 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”的东西来获得结果
希望这可以帮助