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.
[abc]
fonctionne également parfaitement bien et sera plus rapide s'il y a plus de deux candidats à tester. Mais si les chaînes sont arbitraires et que vous ne les connaissez pas à l'avance pour construire une expression régulière, vous devrez utiliser l'any(x in str for x in a)
approche.Réponses:
Vous pouvez utiliser
any
:De même, pour vérifier si toutes les chaînes de la liste sont trouvées, utilisez
all
plutôt queany
.la source
for x in a
comme "pour chaque élément de la liste". Depuisa
est une liste de chaînes, etx
est un élément de cette liste,x
est une chaîne (l'une de 'a', 'b', 'c' dans l'exemple d'origine)any()
est de loin la meilleure approche si tout ce que vous voulez estTrue
ouFalse
, mais si vous voulez savoir spécifiquement quelle chaîne / chaîne correspond, vous pouvez utiliser quelques éléments.Si vous voulez la première correspondance (avec
False
par défaut):Si vous souhaitez obtenir toutes les correspondances (y compris les doublons):
Si vous souhaitez obtenir toutes les correspondances non dupliquées (sans tenir compte de l'ordre):
Si vous souhaitez obtenir toutes les correspondances non dupliquées dans le bon ordre:
la source
OrderedDict
est probablement plus performant qu'une liste. Voir cette réponse sur "Supprimer les doublons dans les listes"Vous devez être prudent si les cordes
a
oustr
s'allongent. Les solutions simples prennent O (S * (A ^ 2)), oùS
est la longueur destr
et A est la somme des longueurs de toutes les chaînesa
. Pour une solution plus rapide, regardez l' algorithme Aho-Corasick pour la correspondance de chaînes, qui s'exécute en temps linéaire O (S + A).la source
Juste pour ajouter de la diversité avec
regex
:ou si votre liste est trop longue -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
la source
(
ou que*
cela échoue, car la citation de la syntaxe regex doit être effectuée.'|'.join(map(re.escape, strings_to_match))
. Vous devriez probablementre.compile('|'.join(...))
aussi.Vous devez répéter les éléments de a.
la source
jbernadas a déjà mentionné l' algorithme Aho-Corasick afin de réduire la complexité.
Voici une façon de l'utiliser en Python:
Télécharger aho_corasick.py depuis ici
Mettez-le dans le même répertoire que votre fichier Python principal et nommez-le
aho_corasick.py
Essayez l'alrorithme avec le code suivant:
Notez que la recherche est sensible à la casse
la source
la source
Cela dépend du contexte, supposez que si vous voulez vérifier un seul littéral comme (n'importe quel mot simple a, e, w, .. etc.) en est suffisant
si vous voulez vérifier l'un des caractères parmi le mot d'origine: utilisez
si vous voulez toutes les entrées que vous voulez dans ce mot d'origine, utilisez tous les simples
la source
Juste plus d'informations sur la façon d'obtenir tous les éléments de liste disponibles dans String
la source
Une approche étonnamment rapide consiste à utiliser
set
:Cela fonctionne si
a
ne contient pas de valeurs à plusieurs caractères (auquel cas utilisezany
comme indiqué ci - dessus ). Si oui, il est plus simple de spécifiera
comme une chaîne:a = 'abc'
.la source
la source
J'utiliserais ce genre de fonction pour la vitesse:
la source
la source