匹配多个随机可选的正则表达式

时间:2013-02-18 21:45:15

标签: python regex

是否可以按任意顺序将多个可选正则表达式与字符串匹配(但可以按特定顺序检索?)

例如,

  

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()

始终以相同的顺序返回pattern1pattern2pattern3,即使有一个或多个None

我知道这听起来不太可能 - 只是想知道是否以及如何做到这一点。

2 个答案:

答案 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”来获取结果

希望这有帮助