I'm using Python 3.4. I have three groups:
g1 = 'g11|g12'
g2 = 'g21|g22'
g3 = 'g31|g32'
I want to match any instance of g3, followed by anything except g2, followed by g1. Here are some strings on which I want to find a match:
'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'
and here are some strings on which I do not want to find a match:
'g31 anything or nothing g21 anything or nothing g11'
'g31g21g11'
I tried: (g31|g32)(?=.*?(g11|g12))(?!.*?(g21|g22))
, which works for
'g31 g11'
and 'g31 g21 g11'
but fails if there is a g21 or g22 after g11, as in 'g31 g11 g21'
.
I've also tried '(g31|g32).*?(g21|g22){0}.*?(g11|g22)'
which works for 'g31 g11'
and 'g31 g21 g11'
but not 'g31 g31 g21 g11'
.
The problem would be trivial if I could expect fixed width strings, e.g., 'g31 g11'
or 'g31 g21 g11'
and there are many solutions to such a problem on stackoverflow already. Also, I could have presented this problem without groups but I want to avoid any solutions that use []
.
I hope that I won't be told that this isn't possible with regex but if it is, so be it.
Thank you!
Try this.See demo:
https://regex101.com/r/hI0qP0/9#python