Вопрос-Ответ

Check if multiple strings exist in another string

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

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

Например:

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

Как я могу заменить if a in s: строку, чтобы получить соответствующий результат?

Переведено автоматически
Ответ 1

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

a_string = "A string is more than its parts!"
matches = ["more", "wholesome", "milk"]

if any(x in a_string for x in matches):

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

Ответ 2

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

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

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

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

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

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

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

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

matches = []
for x in a:
if x in a_string and x not in matches:
matches.append(x)
Ответ 3

Вам следует быть осторожным, если строки в a или str становятся длиннее. Простые решения принимают O(S *(A ^ 2)), где S - длина str, а A - сумма длин всех строк в a. Для более быстрого решения посмотрите на алгоритм Ахо-Корасика для сопоставления строк, который выполняется за линейное время 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))

python list