Проверьте, существует ли несколько строк в другой строке

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

Как

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"

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

Ответ 1

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

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

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

Ответ 2

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)

Ответ 3

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

Ответ 4

Просто добавьте некоторое разнообразие с 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))

Ответ 5

Вам нужно выполнить итерацию по элементам.

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"

Ответ 6

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"

Ответ 7

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

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

  • Скачайте aho_corasick.py из здесь

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

  • Попробуйте использовать alrorithm со следующим кодом:

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

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

Ответ 8

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

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

если вы хотите проверить любой символ из оригинала_слова: используйте

if any(your_required in yourinput for your_required in 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")

Ответ 9

flog = open('test.txt', 'r')
flogLines = flog.readlines()
strlist = ['SUCCESS', 'Done','SUCCESSFUL']
res = False
for line in flogLines:
     for fstr in strlist:
         if line.find(fstr) != -1:
            print('found') 
            res = True


if res:
    print('res true')
else: 
    print('res false')

образ выходного изображения

Ответ 10

Я бы использовал такую функцию для скорости:

def check_string(string, substring_list):
    for substring in substring_list:
        if substring in string:
            return True
    return False

Ответ 11

data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']


# for each
for field in mandatory_fields:
    if field not in data:
        print("Error, missing req field {0}".format(field));

# still fine, multiple if statements
if ('firstName' not in data or 
    'lastName' not in data or
    'age' not in data):
    print("Error, missing a req field");

# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
    print("Error, missing fields {0}".format(", ".join(missing_fields)));

Ответ 12

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

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

Ответ 13

Удивительно быстрый подход заключается в использовании 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'.