Tengo una cadena que comienza con un número (de 0 a 9) Sé que puedo "o" 10 casos de prueba usando startswith () pero probablemente haya una solución más ordenada
entonces en lugar de escribir
if (string.startswith('0') || string.startswith('2') ||
string.startswith('3') || string.startswith('4') ||
string.startswith('5') || string.startswith('6') ||
string.startswith('7') || string.startswith('8') ||
string.startswith('9')):
#do something
¿Existe una forma más inteligente / eficiente?
string.startswith('1')
.s[0]
os[:1]
sino la solución de John Machin:if s.startswith(tuple('0123456789'))
. Además, esta solución genera un error cuando sucede que s es una secuencia como una tupla o una lista, cuyos casos producen el mismo resultado que si fuera una cadena. - Otra solución es una expresión regular cuyo patrón es '\ d (? = \ D)' pero el uso de expresiones regulares es superfluo aquí.string
es un módulo en la biblioteca estándar y probablemente no debería usarse como nombre de variable. docs.python.org/2/library/string.htmlRespuestas:
La
string
biblioteca de Python tiene unisdigit()
método:string[0].isdigit()
fuente
string
módulo de Python2 no tiene métodos yisdigit
es un método de objetosstr
yunicode
.string[:1].isdigit()
>>> string = '1abc' >>> string[0].isdigit() True
fuente
string[0]
?string[:1].isdigit()
, lo que dejará de tratar felizmente con una cadena vacía.a veces, puedes usar regex
>>> import re >>> re.search('^\s*[0-9]',"0abc") <_sre.SRE_Match object at 0xb7722fa8>
fuente
Tu código no funcionará; necesitas en
or
lugar de||
.Tratar
'0' <= strg[:1] <= '9'
o
strg[:1] in '0123456789'
o, si está a punto realmente loco
startswith
,strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
fuente
strg[:1]
tienen dos inconvenientes: no generan un error si s puede resultar ser una lista de cadenas, y producen Verdadero si la cadena comienza con VARIOS dígitos.startswith
e hice poner en práctica esta manera en mi código. Gracias.startswith(tuple(str(i) for i in range(10)))
Este fragmento de código:
for s in ("fukushima", "123 is a number", ""): print s.ljust(20), s[0].isdigit() if s else False
imprime lo siguiente:
fukushima False 123 is a number True False
fuente
s[:1].isdigit()
os and s[0].isdigit()
s and s[0].isdigit()
es incluso menos legible en mi opinión. Personalmente, me gusta la construcción ... si ... si no ... Teniendo en cuenta su comentario, simplemente lo mejoraría así:s[0].isdigit() if s!="" else False
Es sorprendente que después de tanto tiempo todavía falte la mejor respuesta.
La desventaja de las otras respuestas es usar
[0]
para seleccionar el primer carácter, pero como se señaló, esto se rompe en la cadena vacía.Usar lo siguiente evita este problema y, en mi opinión, proporciona la sintaxis más bonita y legible de las opciones que tenemos. Tampoco importa / molesta con expresiones regulares):
>>> string = '1abc' >>> string[:1].isdigit() True >>> string = '' >>> string[:1].isdigit() False
fuente
También puede utilizar
try...except
:try: int(string[0]) # do your stuff except: pass # or do your stuff
fuente
Aquí están mis "respuestas" (tratando de ser único aquí, en realidad no lo recomiendo para este caso en particular :-)
Utilizando
ord () ylaa <= b <= c
forma especial ://starts_with_digit = ord('0') <= ord(mystring[0]) <= ord('9') //I was thinking too much in C. Strings are perfectly comparable. starts_with_digit = '0' <= mystring[0] <= '9'
(Esto
a <= b <= c
, comoa < b < c
, es una construcción especial de Python y es algo ordenado: compare1 < 2 < 3
(verdadero) y1 < 3 < 2
(falso) y(1 < 3) < 2
(verdadero). Así no es como funciona en la mayoría de los otros lenguajes).Usando una expresión regular :
import re //starts_with_digit = re.match(r"^\d", mystring) is not None //re.match is already anchored starts_with_digit = re.match(r"\d", mystring) is not None
fuente
ord()
(2) Pierde el^
en la expresión regular.Podrías usar expresiones regulares .
Puede detectar dígitos usando:
if(re.search([0-9], yourstring[:1])): #do something
El par [0-9] coincide con cualquier dígito y su cadena [: 1] coincide con el primer carácter de su cadena
fuente
Use expresiones regulares , si de alguna manera va a extender la funcionalidad del método.
fuente
Prueba esto:
if string[0] in range(10):
fuente
range(10)
produce una lista de números enteros, mientras questring[0]
es una cadena de longitud 1.if string[0] in map(str,range(10))
funciona