Файл поиска Python для списка слов
Сначала я начал искать файл по одному слову с этим кодом:
import re
shakes = open("tt.txt", "r")
for line in shakes:
if re.match("(.*)(H|h)appy(.*)", line):
print line,
но что, если мне нужно проверить несколько слов? Я думал, что, может быть, что-то вроде for
цикл может работать, поиск файла каждый раз для другого слова в списке.
Как вы думаете, это может быть удобно?
3 ответа
Просто присоединитесь к word_list с |
в качестве разделителя. (?i)
Модификатор без учета регистра помогает сделать регистр без учета регистра.
for line in shakes:
if re.search(r"(?i)"+'|'.join(word_lst), line):
print line,
Пример:
>>> f = ['hello','foo','bar']
>>> s = '''hello
hai
Foo
Bar'''.splitlines()
>>> for line in s:
if re.search(r"(?i)"+'|'.join(f), line):
print(line)
hello
Foo
Bar
Без регулярного выражения:
>>> f = ['hello','foo','bar']
>>> s = '''hello
hai
Foo
Bar'''.splitlines()
>>> for line in s:
if any(i.lower() in line.lower() for i in f):
print(line)
hello
Foo
Bar
Я думаю, что использование регулярных выражений здесь не является питоническим, поскольку регулярное выражение немного неявно. Поэтому я бы использовал циклы, если скорость не имеет большого значения:
def find_word(word_list, line):
for word in word_list:
if word in line:
return line
with open('/path/to/file.txt') as f:
result = [find_word(word_list, line.lower()) for line in f.readlines()]
Другая идея заключается в использовании set
,
Код ниже предполагает, что все слова в вашем файле разделены пробелами и что word_list
список слов для поиска.
shakes = open("tt.txt", "r")
words = set(word_list)
for line in shakes:
if words & set(line.split()):
print line,
Если вы хотите выполнить поиск без учета регистра, вы можете преобразовать каждую строку в нижний регистр:
shakes = open("tt.txt", "r")
words = set(w.lower() for w in word_list)
for line in shakes:
if words & set(line.lower().split()):
print line,