Python正则表达式在两个不同的顺序匹配两个字符串?

时间:2015-03-13 00:43:38

标签: python regex

我希望在以下字符串中匹配aaa bbbbbb aaa

aaa  bbb   bbb    aaa
使用

match = re.search("^(?=.*(aaa))(?=.*?(bbb)).*$", subject, re.DOTALL | re.IGNORECASE)

请参阅https://www.regex101.com/r/vA0nB0/2

但它只匹配aaa bbb

我如何匹配bbb aaa

3 个答案:

答案 0 :(得分:3)

如果Python支持条件:

对于无序的东西,只需使用条件。

注意 - 更改组中的量词以反映有多少项目 需要匹配。下面显示的{2}需要两个项目 您可以将其更改为{1,} - 至少1或+ - 同样的事情。

(?:.*?(?:((?(1)(?!))aaa.*?bbb)|((?(2)(?!))bbb.*?aaa))){2}

Formatted

 (?:
      .*? 
      (?:
           (                        # (1)
                (?(1)
                     (?!)
                )
                aaa .*? bbb 
           )
        |  (                        # (2)
                (?(2)
                     (?!)
                )
                bbb .*? aaa 
           )
      )
 ){2}

输出:

 **  Grp 0 -  ( pos 0 , len 21 ) 
aaa  bbb   bbb    aaa
 **  Grp 1 -  ( pos 0 , len 8 ) 
aaa  bbb
 **  Grp 2 -  ( pos 11 , len 10 ) 
bbb    aaa

答案 1 :(得分:3)

您可以尝试以下简单的正则表达式。

>>> import re
>>> s = 'aaa  bbb   bbb    aaa'
>>> re.findall(r'aaa.*?bbb|bbb.*?aaa', s)
['aaa  bbb', 'bbb    aaa']

答案 2 :(得分:1)

如果您知道它总是aaabbb,那么这样的事情怎么样?

>>> a = 'aaa  bbb   bbb    aaa'
>>> match = re.findall("(aaa|bbb).+?(aaa|bbb)", a, re.DOTALL | re.IGNORECASE)
>>> match
[('aaa', 'bbb'), ('bbb', 'aaa')]

以下是regex101链接:https://www.regex101.com/r/qO3uD3/1