Как я могу проверить, существует ли какая-либо из строк в массиве в другой строке?
Подобно:
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"
Этот код не работает, он просто показывает, чего я хочу достичь.
[abc]
работает отлично и будет быстрее, если нужно протестировать более двух кандидатов. Но если строки являются произвольными, и вы не знаете их заранее, чтобы построить регулярное выражение, вам придется использоватьany(x in str for x in a)
подход.Ответы:
Вы можете использовать
any
:Аналогично, чтобы проверить, все ли строки из списка найдены, используйте
all
вместоany
.источник
for x in a
как «для каждого элемента в списке». Посколькуa
представляет собой список строк иx
является элементом этого списка,x
представляет собой строку (одну из 'a', 'b', 'c' в исходном примере)any()
безусловно, лучший подход, если все, что вы хотите, этоTrue
илиFalse
, но если вы хотите точно знать, какие строки / строки соответствуют, вы можете использовать несколько вещей.Если вы хотите первое совпадение (
False
по умолчанию):Если вы хотите получить все совпадения (включая дубликаты):
Если вы хотите получить все неповторяющиеся совпадения (без учета порядка):
Если вы хотите получить все неповторяющиеся совпадения в правильном порядке:
источник
OrderedDict
вероятно, более производительно, чем список. Смотрите этот ответ на "Удаление дубликатов в списках"Вы должны быть осторожны, если строки
a
илиstr
становятся длиннее. Простые решения берут O (S * (A ^ 2)), гдеS
- длина,str
а A - сумма длин всех строк вa
. Для более быстрого решения взгляните на алгоритм Aho-Corasick для сопоставления строк, который выполняется за линейное время O (S + A).источник
Просто чтобы добавить немного разнообразия с
regex
:или если ваш список слишком длинный -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
источник
(
или*
это не удается, так как цитирование для синтаксиса регулярных выражений должно быть сделано.'|'.join(map(re.escape, strings_to_match))
. Вы, наверное,re.compile('|'.join(...))
тоже.Вам нужно перебрать элементы a.
источник
Jbernadas уже упоминал алгоритм Aho-Corasick , чтобы уменьшить сложность.
Вот один из способов использовать его в Python:
Загрузите aho_corasick.py отсюда
Поместите его в тот же каталог, что и ваш основной файл Python, и назовите его
aho_corasick.py
Попробуйте alrorithm с помощью следующего кода:
Обратите внимание, что поиск чувствителен к регистру
источник
источник
Это зависит от контекста , предположим , если вы хотите , чтобы проверить одного Литерал как (любое одно слово а, е, ж, .. и т.д.) в достаточно
если вы хотите проверить какой-либо символ из оригинального слова: используйте
если вы хотите, чтобы все входные данные были в этом оригинальном слове, используйте все простые
источник
Еще немного информации о том, как получить все элементы списка, доступные в String.
источник
Удивительно быстрый подход заключается в использовании
set
:Это работает, если
a
не содержит многосимвольных значений (в этом случае используйтеany
как указано выше ). Если это так, то проще указатьa
в виде строки:a = 'abc'
.источник
источник
Я бы использовал такую функцию для скорости:
источник
источник