Python finditer или sub для большого текста Unicode - PullRequest
1 голос
/ 06 мая 2019

Я должен заменить в большой текстовый документ 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:]

Какой из этих подходов быстрее?

...