Python re module staje się 20 razy wolniejszy, gdy zapętlasz więcej niż 100 różnych wyrażeń regularnych

Mój problem polega na analizowaniu plików dziennika i usuwaniu części zmiennych w każdej linii, aby je pogrupować. Na przykład:

s = re.sub(r'(?i)User [_0-9A-z]+ is ', r"User .. is ", s)
s = re.sub(r'(?i)Message rejected because : (.*?) \(.+\)', r'Message rejected because : \1 (...)', s)

Mam około 120+ pasujących reguł, takich jak powyżej.

Nie znalazłem żadnych problemów z wydajnością podczas wyszukiwania kolejno po 100 różnych wyrażeń regularnych. Ale ogromne spowolnienie występuje przy stosowaniu 101 wyrażeń regularnych.

Dokładnie to samo dzieje się przy zastępowaniu moich reguł

for a in range(100):
    s = re.sub(r'(?i)caught here'+str(a)+':.+', r'( ... )', s)

Zamiast tego korzystał z 20-krotnie wolniejszego zakresu (101).

# range(100)
% ./dashlog.py file.bz2
== Took  2.1 seconds.  ==

# range(101)
% ./dashlog.py file.bz2
== Took  47.6 seconds.  ==

Dlaczego tak się dzieje? Czy istnieje jakieś znane obejście?

(Dzieje się w Pythonie 2.6.6 / 2.7.2 w systemie Linux / Windows.)

questionAnswers(1)

yourAnswerToTheQuestion