¿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_1volvería Falsepor no tener letras del alfabeto en él y string_2volvería Truepor 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.isalphaincluso? 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.Matchobjeto si hay una coincidencia oNonesi 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) Truefuente
set(string_1)Sería más eficaz?setpuede 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).oresto 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() Trueabajo: 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 vuelveTruesolo 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() FalseEl 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() Falsefuente
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 valueTambién tenga en cuenta que si la variable val devuelve Ninguno. Eso significa que la búsqueda no encontró una coincidencia.
fuente