It turns out that the way I tried to work around regex's behavior difference
with re2 and Python's re was 1) buggy and 2) much more complicated than
needed.
In a few words:
regex adds .* on either side of patterns when no start or end anchor is
present. My previous workaround put ^ or $ for every pattern, which is
wrong even without the other 2 bugs on top of it.
Using ^(?:<patterns>) right at the end of the regex path fixes the issue.
I've opened an issue to get a build option instead:
https://github.com/rust-lang/regex/issues/675