Проверьте, существует ли несколько строк в другой строке - PullRequest
307 голосов
/ 02 августа 2010

Как я могу проверить, существует ли какая-либо из строк в массиве в другой строке?

Как:

a = ['a', 'b', 'c']
str = "a123"
if a in str:
  print "some of the strings found in str"
else:
  print "no strings found in str"

Этот код не работает, он просто показываетхочу достичь.

Ответы [ 13 ]

587 голосов
/ 02 августа 2010

Вы можете использовать any:

if any(x in str for x in a):

Аналогично, чтобы проверить, найдены ли все строки из списка,используйте all вместо any.

52 голосов
/ 24 мая 2016

any() является безусловно лучшим подходом, если все, что вам нужно, это True или False, но если вы хотите точно знать, какие строки / строки соответствуют, вы можете использовать пару вещей.

Если вы хотите первое совпадение (с False по умолчанию):

match = next((x for x in a if x in str), False)

Если вы хотите получить все совпадения (включая дубликаты):

matches = [x for x in a if x in str]

Если вы хотитечтобы получить все неповторяющиеся совпадения (без учета порядка):

matches = {x for x in a if x in str}

Если вы хотите получить все неповторяющиеся совпадения в правильном порядке:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)
39 голосов
/ 02 августа 2010

Вы должны быть осторожны, если строки в a или str становятся длиннее. Простые решения принимают O (S * (A ^ 2)), где S - длина str, а A - сумма длин всех строк в a. Для более быстрого решения посмотрите алгоритм Aho-Corasick для сопоставления строк, который выполняется за линейное время O (S + A).

16 голосов
/ 24 мая 2016

Просто добавьте немного разнообразия с regex:

import re

if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
    print 'possible matches thanks to regex'
else:
    print 'no matches'

или если ваш список слишком длинный - any(re.findall(r'|'.join(a), str, re.IGNORECASE))

8 голосов
/ 02 августа 2010

Вам нужно перебрать элементы a.

a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:    
    if item in str:
        found_a_string = True

if found_a_string:
    print "found a match"
else:
    print "no match found"
3 голосов
/ 02 августа 2010
a = ['a', 'b', 'c']
str =  "a123"

a_match = [True for match in a if match in str]

if True in a_match:
  print "some of the strings found in str"
else:
  print "no strings found in str"
2 голосов
/ 20 июля 2017

jbernadas уже упоминал алгоритм Aho-Corasick , чтобы уменьшить сложность.

Вот один из способов использовать его в Python:

  1. Загрузите aho_corasick.py с здесь

  2. Поместите его в тот же каталог, что и ваш основной файл Python, и назовите его aho_corasick.py

  3. Попробуйте алгоритм с использованием следующего кода:

    from aho_corasick import aho_corasick #(string, keywords)
    
    print(aho_corasick(string, ["keyword1", "keyword2"]))
    

Обратите внимание, что поиск с учетом регистра

1 голос
/ 30 ноября 2016

зависит от контекста Предположим, что если вы хотите проверить, как один литерал (любое отдельное слово a, e, w, .. и т. д.) в достаточно

original_word ="hackerearcth"
for 'h' in original_word:
      print("YES")

, если вы хотите проверить любой из символов среди original_word: использовать

if any(your_required in yourinput for your_required in original_word ):

если вы хотите, чтобы все входные данные, которые вы хотите в этом original_word, использовали все простой

original_word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_word in yourinput for requested_word in original_word):
    print("yes")
0 голосов
/ 19 марта 2019

Удивительно быстрый подход заключается в использовании set:

a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
    print("some of the strings found in str")
else:
    print("no strings found in str")

Это работает, если a не содержит многосимвольных значений (в этом случае используйте any, как указано выше ).Если это так, проще указать a в виде строки: a = 'abc'.

0 голосов
/ 25 июня 2018

Еще немного информации о том, как получить все элементы списка, доступные в строке

a = ['a', 'b', 'c']
str = "a123" 
list(filter(lambda x:  x in str, a))
...