Файл поиска 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,
Другие вопросы по тегам