正则表达式:如果组 2 不在组 3 和组 1 之间,则匹配 "group3.*group1"

Regex: match "group3.*group1" if group2 is not between groups 3 and 1

我正在使用 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',那么这个问题将是微不足道的,并且在 Whosebug 上已经有很多解决此类问题的方法。另外,我本可以在没有小组的情况下提出这个问题,但我想避免任何使用 [].

的解决方案

我希望不会有人告诉我这不能用正则表达式实现,但如果可以,那就这样吧。

谢谢!

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

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

DEMO

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

尝试 this.See 演示:

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