Let’s talk about not so clearly viewed but important thing as regex execution sequence.
Let’s imagine, we have a list of strings:
sarr = [
and we need to match any string ‘^dog.*\.env$’, but not contained ‘-bone[0-9]*’
So, the matches sould be: 3rd, 6th and 8th strings
Referer docs: python’s regex
The first what cames into the head is the following:
>>> [re.match(r'^dog.*(?!-bone[0-9]*)\.env$', s) is not None for s in sarr]
[False, True, True, False, True, True, False, True]
“Whuuuut?” it was my first reaction. A few minutes later with colleague’s help, we’ve found the solution, here it is:
>>> [re.match(r'^dog(?!.*-bone[0-9]*).*\.env$', s) is not None for s in sarr]
[False, False, True, False, False, True, False, True]
Seems, as you can guessed, python’s regex have sequentially processing of conditional rules
So, in the first case using human words:
1) Does string is starts with 'dog'?
2) Keep in mind any-characters sentence, mark them.
3) Does string contains '-bone[0-9]*'?
Yes? I could quit, BTW, it got match to previous rule, then OK.
4) Does string ends with '\.env'
When the second could reads as:
1) Does string starts with 'dog'?
2) Does string contains any sentence '.*-bone[0-9]*'? Yes? This isn't our case, quit.
3) Does string ends with sentence '.*\.env'?
That’s it. I hope, this post helps you or you’ve got a new piece of knowledge.