It's fast because any() shortcircuits the same way "or" does. It's way shorter than the comparable "for" loop. Last of all, I think it's very readable, at least if you're used to reading list comprehensions.

Save time when? They get compiled in any case the first time they are used, and (C)Python caches previously used regexes, so there is actually no advantage to explicitly compiling them except that it arguably makes for better readability in this case.