Подтвердить что ты не робот

Как проверить, имеет ли строка одну из строк в списке?

Возможный дубликат:
Проверьте, существует ли несколько строк в другой строке

Я пытаюсь выяснить, есть ли хороший и чистый способ протестировать 3 разных строки.

В основном я выполняю цикл через файл с использованием цикла for; то я должен проверить, содержит ли он одну из трех строк, которые я установил в списке.

До сих пор я обнаружил, что проверка состояния нескольких if, но это не очень элегантно и эффективно:

for line in file
    if "string1" in line or "string2" in line or "string3" in line:
        print "found the string"

Я думал, как создать список, содержащий string1, string2 и string3, и проверить, содержится ли какое-либо из них в строке, но, похоже, я не могу просто сравнить список без явным образом прохожу через список, и в этом случае я в основном в тех же условиях, что и в выражении multiple if, которое я написал выше.

Есть ли какой-либо умный способ проверить несколько строк без написания длинных операторов if или loop через элементы списка?

4b9b3361

Ответ 1

strings = ("string1", "string2", "string3")
for line in file:
    if any(s in line for s in strings):
        print "yay!"

Ответ 2

Это все еще проходит через декартово произведение двух списков, но это делает одну строку:

>>> lines1 = ['soup', 'butter', 'venison']
>>> lines2 = ['prune', 'rye', 'turkey']
>>> search_strings = ['a', 'b', 'c']
>>> any(s in l for l in lines1 for s in search_strings)
True
>>> any(s in l for l in lines2 for s in search_strings)
False

Это также имеет то преимущество, что any короткое замыкание, и поэтому цикл останавливается, как только будет найдено совпадение. Кроме того, это только находит первое вхождение строки из search_strings в linesX. Если вы хотите найти несколько вхождений, вы можете сделать что-то вроде этого:

>>> lines3 = ['corn', 'butter', 'apples']
>>> [(s, l) for l in lines3 for s in search_strings if s in l]
[('c', 'corn'), ('b', 'butter'), ('a', 'apples')]

Если вам кажется, что кодирование происходит чем-то более сложным, кажется, алгоритм Aho-Corasick может проверить наличие нескольких подстрок в заданной входной строке. (Спасибо Niklas B. за указание на это.) Я все еще думаю, что это приведет к квадратичной производительности для вашего случая использования, так как вам все равно придется называть его несколько раз для поиска нескольких строк. Тем не менее, он будет бить выше (кубический, в среднем) алгоритм.

Ответ 3

Один подход заключается в объединении строк поиска в шаблон регулярного выражения, как в этом ответе.