正则表达式:匹配" group3。* group1"如果group2不在第3组和第1组之间

时间:2015-06-13 19:05:59

标签: regex python-3.x regex-negation regex-lookarounds

我正在使用Python 3.4。 我有三组:

g1 = 'g11|g12'
g2 = 'g21|g22'
g3 = 'g31|g32'

我希望匹配g3的任何实例,后跟除g2之外的任何内容,然后是g1。以下是我想要找到匹配的一些字符串:

'g31 anything or nothing g11'  
'g31g11'
EDIT:  ADDED:  'anything or nothing g31 g11 anything or nothing'
EDIT:  ADDED:  'anything or nothing g21 g31 g11 anything or nothing'

这里有一些我不想找到匹配的字符串:

'g31 anything or nothing g21 anything or nothing g11'
'g31g21g11'

我试过:(g31|g32)(?=.*?(g11|g12))(?!.*?(g21|g22)),适用于 'g31 g11''g31 g21 g11',但如果在g11之后存在g21或g22,则会失败,如'g31 g11 g21'中所示。

我还试过'(g31|g32).*?(g21|g22){0}.*?(g11|g22)',它适用于'g31 g11''g31 g21 g11'但不适用于'g31 g31 g21 g11'

如果我可以期待固定宽度字符串,例如'g31 g11''g31 g21 g11',那么问题将是微不足道的,并且已经有很多解决方案来解决stackoverflow上的问题。此外,我可以在没有组的情况下提出此问题,但我想避免使用[]

的任何解决方案

我希望我不会被告知,这与正则表达式不可能,但如果是,那就这样吧。

谢谢!

2 个答案:

答案 0 :(得分:2)

^.*?(?:g31|g32)(?!.*?(?:g21|g22)).*?(?:g11|g12).*$

试试这个。参见演示:

https://regex101.com/r/hI0qP0/9#python

答案 1 :(得分:1)

完全有可能..您可以使用以下正则表达式:

 g3\d+(?:(?!g2).)*g1\d+

请参阅DEMO