Этот скрипт Python 2 формирует старые слова в одно регулярное выражение, а затем заменяет соответствующее новое слово на основе индекса старого слова, которое соответствует.Старые слова сопоставляются, только если они различны.Эта особенность обеспечивается окружением слова в r '\ b', которое является границей слова регулярного выражения.
Входные данные поступают из командной строки (это закомментированная альтернатива, которую я использовал для разработки в режиме ожидания).Вывод в стандартный вывод
Основной текст сканируется только один раз в этом решении.С ответом от Jaypals, вывод такой же.
#!/bin/env python
import sys, re
def replacer(match):
global new
return new[match.lastindex-1]
if __name__ == '__main__':
fname_old, fname_new, fname_txt = sys.argv[1:4]
#fname_old, fname_new, fname_txt = 'oldwords.txt oldwordreplacements.txt oldwordreplacer.txt'.split()
with file(fname_old) as f:
# Form regular expression that matches old words, grouped in order
old = '(?:' + '|'.join(r'\b(%s)\b' % re.escape(word)
for word in f.read().strip().split()) + ')'
with file(fname_new) as f:
# Ordered list of replacement words
new = [word for word in f.read().strip().split()]
with file(fname_txt) as f:
# input text
txt = f.read()
# Output the new text
print( re.subn(old, replacer, txt)[0] )
Я только что сделал некоторые статистические данные для текстового файла размером ~ 100 Кбайт:
Total characters in text: 116413
Total words in text: 17114
Total distinct words in text: 209
Top 10 distinct word occurences in text: 2664 = 15.57%
Текст состоял из 250 абзацевlorum ipsum, сгенерированный из здесь Я просто взял десять наиболее часто встречающихся слов и заменил их на строки от ОДНА до ДЕСЯТИ по порядку.
Решение регулярного выражения Python на порядок быстрее, чемНа данный момент выбрано лучшее решение от Jaypal.Выбор Python заменит слова, за которыми следует символ новой строки или пунктуация, а также любые пробелы (включая вкладки и т. Д.).
Кто-то заметил, что решение на C будет простым и быстрым в создании.Несколько десятилетий назад некоторые мудрые юноши из Unix заметили, что это обычно не так, и создали инструменты для создания сценариев, такие как awk, для повышения производительности.Это задание идеально подходит для языков сценариев, и техника, показанная в приложении Python, может быть воспроизведена в Ruby или Perl.