Eu tenho uma string que começa com um número (de 0-9) Eu sei que posso "ou" 10 casos de teste usando startswith () mas provavelmente há uma solução mais limpa
então ao invés de escrever
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 uma maneira mais inteligente / eficiente?
string.startswith('1')
.s[0]
ous[:1]
Mas a solução de John Machin:if s.startswith(tuple('0123456789'))
. Além disso, essa solução gera erro quando acontece que s é uma sequência como uma tupla ou lista, cujos casos produzem o mesmo resultado que se fosse uma string. - Outra solução é uma regex cujo padrão é '\ d (? = \ D)', mas o uso de regex é supérfluo aqui.string
é um módulo da biblioteca padrão e provavelmente não deve ser usado como um nome de variável. docs.python.org/2/library/string.htmlRespostas:
A
string
biblioteca do Python temisdigit()
método:string[0].isdigit()
fonte
string
módulo do Python2 não tem métodos eisdigit
é um método destr
eunicode
objetos.string[:1].isdigit()
>>> string = '1abc' >>> string[0].isdigit() True
fonte
string[0]
?string[:1].isdigit()
, o que não deixará de lidar com uma string vazia.às vezes, você pode usar regex
>>> import re >>> re.search('^\s*[0-9]',"0abc") <_sre.SRE_Match object at 0xb7722fa8>
fonte
Seu código não funcionará; você precisa em
or
vez de||
.Experimentar
'0' <= strg[:1] <= '9'
ou
strg[:1] in '0123456789'
ou, se você é realmente louco por
startswith
,strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
fonte
strg[:1]
têm dois inconvenientes: não geram um erro se s for uma lista de strings e produzem True se a string começar com VÁRIOS dígitos.startswith
e implementei dessa forma em meu código. Obrigado.startswith(tuple(str(i) for i in range(10)))
É surpreendente que depois de tanto tempo ainda falte a melhor resposta.
A desvantagem das outras respostas é usar
[0]
para selecionar o primeiro caractere, mas, como observado, isso quebra na string vazia.Usar o seguinte contorna esse problema e, na minha opinião, fornece a sintaxe mais bonita e legível das opções que temos. Também não importa / incomoda com regex):
>>> string = '1abc' >>> string[:1].isdigit() True >>> string = '' >>> string[:1].isdigit() False
fonte
Este trecho de código:
for s in ("fukushima", "123 is a number", ""): print s.ljust(20), s[0].isdigit() if s else False
imprime o seguinte:
fukushima False 123 is a number True False
fonte
s[:1].isdigit()
ous and s[0].isdigit()
s and s[0].isdigit()
é ainda menos legível na minha opinião. Pessoalmente, gosto da construção ... if ... else ... Levando em consideração sua observação, gostaria apenas de melhorá-la assim:s[0].isdigit() if s!="" else False
Você também pode usar
try...except
:try: int(string[0]) # do your stuff except: pass # or do your stuff
fonte
Aqui estão minhas "respostas" (tentando ser único aqui, eu realmente não recomendo para este caso em particular :-)
Usando
ord () eoa <= b <= c
formulário 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'
(Isso
a <= b <= c
, comoa < b < c
, é uma construção especial do Python e é bem legal: compare1 < 2 < 3
(verdadeiro) e1 < 3 < 2
(falso) e(1 < 3) < 2
(verdadeiro). Não é assim que funciona na maioria das outras linguagens.)Usando uma expressão 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
fonte
ord()
(2) Perder o^
na regex.Você pode usar expressões regulares .
Você pode detectar dígitos usando:
if(re.search([0-9], yourstring[:1])): #do something
O par [0-9] corresponde a qualquer dígito, e sua string [: 1] corresponde ao primeiro caractere de sua string
fonte
Use Expressões regulares , se você for estender de alguma forma a funcionalidade do método.
fonte
Experimente isto:
if string[0] in range(10):
fonte
range(10)
produz uma lista de inteiros, enquantostring[0]
é uma string de comprimento 1.if string[0] in map(str,range(10))
funciona