正则表达式:如果组 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 演示:
我正在使用 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 演示: