Несмотря на часто выражаемую антипатию к регулярным выражениям со стороны многих в сообществе Python, они действительно являются ценным инструментом для соответствующих случаев использования, которые определенно включают в себя идентификацию слов и фраз (благодаря элементу \b
«граница слова» в шаблоны регулярных выражений - альтернативы, основанные на обработке строк, представляют гораздо большую проблему, например, .split()
использует пробел в качестве разделителя и, таким образом, досадно оставляет знаки препинания прикрепленными к соседним словам и т. д. и т. д.).
Если RE в порядке, я бы рекомендовал что-то вроде:
import re
import sys
def main():
if len(sys.argv) != 3:
print("Usage: %s fileofstufftofind filetofinditin" % sys.argv[0])
sys.exit(1)
with open(sys.argv[1]) as f:
patterns = [r'\b%s\b' % re.escape(s.strip()) for s in f]
there = re.compile('|'.join(patterns))
with open(sys.argv[2]) as f:
for i, s in enumerate(f):
if there.search(s):
print("Line %s: %r" % (i, s))
main()
первый аргумент — это (путь) текстовый файл со словами или фразами для поиска, по одному в строке, а второй аргумент (путь) — текстовый файл, в котором их нужно найти. При желании легко сделать случай нечувствительным к поиску (возможно, просто опционально на основе переключателя параметров командной строки) и т. д. и т. д.
Некоторое пояснение для читателей, не знакомых с RE...:
Элемент \b
в patterns
элементах гарантирует, что случайных совпадений не будет (если вы ищете «кошка» или «собака», вы не увидите случайного совпадения с «каталогом» или «аутсайдером»; и вы выиграли не пропустите попадание в "Кошка, улыбнувшись, убежала" по некоторому расщеплению, думая, что слово там "кошка", включая запятую ;-).
Элемент |
означает or
, поэтому, например. из текстового файла с содержимым (две строки)
cat
dog
это сформирует шаблон '\bcat\b|\bdog\b'
, который найдет либо «кошку», либо «собаку» (как отдельные слова, игнорируя пунктуацию, но отклоняя совпадения в более длинных словах).
re.escape
избегает знаков препинания, поэтому он соответствует буквально, а не со специальным значением, как это обычно имеет место в шаблоне RE.
person
Alex Martelli
schedule
09.06.2010