web-dev-qa-db-fra.com

Vérifier si plusieurs chaînes existent dans une autre chaîne

Comment puis-je vérifier si l'une des chaînes d'un tableau existe dans une autre chaîne?

Comme:

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"

Ce code ne fonctionne pas, c'est juste pour montrer ce que je veux réaliser.

274
jahmax

Vous pouvez utiliser any :

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

De même, pour vérifier si tous les chaînes de la liste sont trouvées, utilisez all au lieu de any.

537
Mark Byers

any() est de loin la meilleure approche si tout ce que vous voulez est True ou False, mais si vous voulez savoir précisément quelle chaîne correspond, vous pouvez utiliser plusieurs choses.

Si vous voulez la première correspondance (avec False par défaut):

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

Si vous souhaitez obtenir toutes les correspondances (y compris les doublons):

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

Si vous souhaitez obtenir toutes les correspondances non dupliquées (sans tenir compte de l'ordre):

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

Si vous voulez obtenir toutes les correspondances sans doublons dans le bon ordre:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)
48
zondo

Soyez prudent si les chaînes dans a ou str deviennent plus longues. Les solutions simples prennent O (S * (A ^ 2)), où S est la longueur de str et A est la somme des longueurs de toutes les chaînes de a. Pour une solution plus rapide, regardez Aho-Corasick algorithme de correspondance des chaînes, qui s'exécute en temps linéaire O (S + A).

37
jbernadas

Juste pour ajouter de la diversité avecregex:

import re

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

ou si votre liste est trop longue - any(re.findall(r'|'.join(a), str, re.IGNORECASE))

14
jetpackdata.com

Vous devez parcourir les éléments de 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 a déjà mentionné le Aho-Corasick-Algorithm afin de réduire la complexité.

Voici une façon de l'utiliser en Python:

  1. Téléchargez aho_corasick.py depuis ici

  2. Placez-le dans le même répertoire que votre fichier Python principal et nommez-le aho_corasick.py

  3. Essayez l'alrorithm avec le code suivant:

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

Notez que la recherche est sensible à la casse

2
Domi W

Cela dépend du contexte. Supposez si vous voulez vérifier un seul littéral comme (n'importe quel mot simple a, e, w, etc.) in est suffisant

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

si vous voulez vérifier l’un des caractères parmi les caractères originaux: utilisez 

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

si vous voulez toute l'entrée que vous voulez dans cet original_Word, utilisez tout 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

Je voudrais utiliser ce genre de fonction pour la vitesse:

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

Quelques informations supplémentaires sur la façon d'obtenir tous les éléments de liste disponibles dans String

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

Une approche étonnamment rapide consiste à utiliser 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")

Cela fonctionne si a ne contient aucune valeur de plusieurs caractères (auquel cas, utilisez any tel qu'énuméré ci-dessus ). Si c'est le cas, il est plus simple de spécifier a en tant que chaîne: a = 'abc'.

0
Berislav Lopac