¿Cómo puedo verificar si alguna de las cadenas de una matriz existe en otra cadena?
Me gusta:
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"
Ese código no funciona, es solo para mostrar lo que quiero lograr.
[abc]
también funciona perfectamente bien y será más rápido si hay más de un par de candidatos para evaluar. Pero si las cadenas son arbitrarias y no las conoce de antemano para construir una expresión regular, tendrá que usar elany(x in str for x in a)
enfoque.Respuestas:
Puedes usar
any
:De manera similar, para verificar si se encuentran todas las cadenas de la lista, use en
all
lugar deany
.fuente
for x in a
como "para cada elemento de la lista". Dado quea
es una lista de cadenas, yx
es un elemento de esa lista,x
es una cadena (una de 'a', 'b', 'c' en el ejemplo original)any()
es, con mucho, el mejor enfoque si todo lo que quiere esTrue
oFalse
, pero si desea saber específicamente qué cadena / cadenas coinciden, puede usar un par de cosas.Si desea la primera coincidencia (con el
False
valor predeterminado):Si desea obtener todas las coincidencias (incluidos los duplicados):
Si desea obtener todas las coincidencias no duplicadas (sin tener en cuenta el orden):
Si desea obtener todas las coincidencias no duplicadas en el orden correcto:
fuente
OrderedDict
es probablemente más eficaz que una lista. Vea esta respuesta en "Eliminar duplicados en listas"Debe tener cuidado si las cuerdas entran
a
ostr
se alargan. Las soluciones directas toman O (S * (A ^ 2)), dondeS
es la longitud destr
y A es la suma de las longitudes de todas las cadenasa
. Para una solución más rápida, mire el algoritmo Aho-Corasick para la coincidencia de cadenas, que se ejecuta en tiempo lineal O (S + A).fuente
Solo para agregar algo de diversidad con
regex
:o si tu lista es demasiado larga
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
fuente
(
o*
esto falla, ya que se debe citar la sintaxis de expresiones regulares.'|'.join(map(re.escape, strings_to_match))
. Probablementere.compile('|'.join(...))
también deberías .Necesita iterar sobre los elementos de a.
fuente
jbernadas ya mencionó el algoritmo Aho-Corasick-Algoritmo para reducir la complejidad.
Aquí hay una forma de usarlo en Python:
Descargue aho_corasick.py desde aquí
Póngalo en el mismo directorio que su archivo Python principal y asígnele un nombre
aho_corasick.py
Pruebe el alroritmo con el siguiente código:
Tenga en cuenta que la búsqueda distingue entre mayúsculas y minúsculas
fuente
fuente
Depende del contexto supongo que si usted quiere comprobar sola literal como (palabra única a, e, w, etc ..) en es suficiente
si desea verificar cualquiera de los caracteres entre la palabra original: utilice
si desea toda la entrada que desea en esa palabra_original, utilice todos los simples
fuente
Solo un poco más de información sobre cómo obtener todos los elementos de la lista disponibles en String
fuente
Un enfoque sorprendentemente rápido es usar
set
:Esto funciona si
a
no contiene ningún valor de caracteres múltiples (en cuyo caso, useany
como se menciona anteriormente ). Si es así, es más sencillo para especificara
como una cadena:a = 'abc'
.fuente
fuente
Usaría este tipo de función para la velocidad:
fuente
fuente