it-roy-ru.com

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

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

Подобно:

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"

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

274
jahmax

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

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

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

537
Mark Byers

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)
48
zondo

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

37
jbernadas

Просто добавьте немного разнообразия с помощью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))

14
jetpackdata.com

Вам нужно перебрать элементы 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"
7
Seamus Campbell
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"
3
mluebke

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

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

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

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

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

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

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

2
Domi W

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

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, используйте all simple

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")
1
Trinadh Koya

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

def check_string(string, substring_list):
    for substring in substring_list:
        if substring in string:
            return True
    return False
0
Ivan Mikhailov
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)));
0
Robert I
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')

 output example image

0
LeftSpace

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

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

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