¿Cuál es la mejor implementación de Python pura para verificar si una cadena contiene CUALQUIER letra del alfabeto?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
Donde string_1
volvería False
por no tener letras del alfabeto en él y string_2
volvería True
por tener letra.
Respuestas:
Regex debería ser un enfoque rápido:
re.search('[a-zA-Z]', the_string)
fuente
any(c.isalpha() for c in string_1)
es deliciosamente Pythonic.isalpha
incluso? Esto tendrá comportamientos totalmente diferentes al comparar Python 2 con Python 3. ¿Es el chino parte del alfabeto? Si no es así, lo está haciendo coincidir ciegamente con su generador en Python 3 (¡O Python 2 para cadenas Unicode!). Si quieres Pythonic , aquí está:Simple is better than complex.
. Y revise el comentario de OP arriba: Él quiere que solo se combine el alfabeto romano.Match
objeto si hay una coincidencia oNone
si no la hay. Entonces esto es compatible con unif re.search(...
patrón.Qué tal si:
>>> string_1 = "(555).555-5555" >>> string_2 = "(555) 555 - 5555 ext. 5555" >>> any(c.isalpha() for c in string_1) False >>> any(c.isalpha() for c in string_2) True
fuente
set(string_1)
Sería más eficaz?set
puede reducir o no las llamadas a funciones, pero agrega algunos gastos generales.Puede usar
islower()
en su cadena para ver si contiene algunas letras minúsculas (entre otros caracteres).or
esto conisupper()
para comprobar también si contiene algunas letras mayúsculas:abajo: letras en la cadena: la prueba arroja verdadero
>>> z = "(555) 555 - 5555 ext. 5555" >>> z.isupper() or z.islower() True
abajo: no hay letras en la cadena: la prueba arroja falso.
>>> z= "(555).555-5555" >>> z.isupper() or z.islower() False >>>
No confundirse con lo
isalpha()
que vuelveTrue
solo si todos los caracteres son letras, que no es lo que quieres.Tenga en cuenta que la respuesta de Barm completa la mía muy bien, ya que la mía no maneja bien el caso mixto.
fuente
Me gustó la respuesta proporcionada por @ jean-françois-fabre , pero está incompleta.
Su enfoque funcionará, pero solo si el texto contiene letras puramente minúsculas o mayúsculas:
>>> text = "(555).555-5555 extA. 5555" >>> text.islower() False >>> text.isupper() False
El mejor enfoque es poner primero en mayúsculas o minúsculas su cadena y luego verificar.
>>> string1 = "(555).555-5555 extA. 5555" >>> string2 = '555 (234) - 123.32 21' >>> string1.upper().isupper() True >>> string2.upper().isupper() False
fuente
Puede usar expresiones regulares como esta:
import re print re.search('[a-zA-Z]+',string)
fuente
Probé cada uno de los métodos anteriores para encontrar si hay alfabetos contenidos en una cadena determinada y descubrí el tiempo de procesamiento promedio por cadena en una computadora estándar.
~ 250 ns para
import re
~ 3 µs para
re.search('[a-zA-Z]', string)
~ 6 µs para
any(c.isalpha() for c in string)
~ 850 ns para
Al contrario de lo que se alega, la importación de re toma un tiempo insignificante, y la búsqueda con re toma casi la mitad del tiempo en comparación con la iteración de isalpha () incluso para una cadena relativamente pequeña.
Por lo tanto, para cadenas y recuentos más grandes, re sería significativamente más eficiente.
Pero la conversión de la cadena a un caso y la comprobación del caso (es decir, cualquiera de las mayúsculas (). Isupper () o lower (). Islower () ) gana aquí. En cada bucle es significativamente más rápido que re.search () y ni siquiera requiere importaciones adicionales.
fuente
También puedes hacer esto además
import re string='24234ww' val = re.search('[a-zA-Z]+',string) val[0].isalpha() # returns True if the variable is an alphabet print(val[0]) # this will print the first instance of the matching value
También tenga en cuenta que si la variable val devuelve Ninguno. Eso significa que la búsqueda no encontró una coincidencia.
fuente