Я должен заменить в большой текстовый документ Unicode несколько вхождений токенов.
В настоящее время я перебираю слова моего словаря и заменяю sub
скомпилированным регулярным выражением:
for token,replacement in dictionary.tokens().iteritems():
r = re.compile(word_regex_unicode(token), flags=re.I | re.X | re.UNICODE)
text = r.sub(replacement,text)
где мое слово regex похоже на
# UTF8 unicode word regex
def word_regex_unicode(word):
return r"(?<!\S){}(?!\S)".format(re.escape(word))
Это означает, что необходимо скомпилировать новое регулярное выражение, а затем для каждого токена будет выполнен вызов sub
, если он присутствует или отсутствует в документе text
.
В качестве альтернативного подхода можно использовать re.finditer
, чтобы найти вхождения токена, а затем вызвать re.sub
, если токен был найден:
for token,replacement in dictionary.tokens().iteritems():
r = re.compile(word_regex_unicode(token), flags=re.I | re.X | re.UNICODE)
for m in r.finditer(token,text):
# now call sub
text = r.sub(replacement,text)
, таким образом, избегая звонков на re.sub
, когда они фактически не нужны.
Последний подход можно улучшить, используя групповой результат re.finditer
:
for m in r.finditer(token,text):
# match start: match.start()
index = match.start()
# replace from start to end
text = text[:index] + token + text[index + 1:]
Какой из этих подходов быстрее?