Mam ciąg zaczynający się od liczby (od 0-9) Wiem, że mogę "lub" 10 przypadków testowych z użyciem funkcji startwith (), ale prawdopodobnie istnieje lepsze rozwiązanie
więc zamiast pisać
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
Czy istnieje sprytniejszy / wydajniejszy sposób?
string.startswith('1')
.s[0]
albos[:1]
ale rozwiązanie Jana Machin:if s.startswith(tuple('0123456789'))
. Co więcej, to rozwiązanie generuje błąd, gdy zdarza się, że s jest sekwencją taką jak krotka lub lista, co daje taki sam wynik, jak gdyby był łańcuchem. - Innym rozwiązaniem jest wyrażenie regularne, którego wzorzec to „\ d (? = \ D)”, ale użycie wyrażenia regularnego jest tutaj zbędne.string
to moduł w bibliotece standardowej i prawdopodobnie nie powinien być używany jako nazwa zmiennej. docs.python.org/2/library/string.htmlOdpowiedzi:
string
Biblioteka Pythona maisdigit()
metodę:string[0].isdigit()
źródło
string
Moduł Python2 nie ma metod iisdigit
jest metodą obiektówstr
iunicode
.string[:1].isdigit()
>>> string = '1abc' >>> string[0].isdigit() True
źródło
string[0]
?string[:1].isdigit()
, co szczęśliwie zakończy pracę z pustym ciągiem.czasami możesz użyć wyrażenia regularnego
>>> import re >>> re.search('^\s*[0-9]',"0abc") <_sre.SRE_Match object at 0xb7722fa8>
źródło
Twój kod nie zadziała; potrzebujesz
or
zamiast||
.Próbować
'0' <= strg[:1] <= '9'
lub
strg[:1] in '0123456789'
a jeśli naprawdę szaleją
startswith
,strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
źródło
strg[:1]
mają dwie niedogodności: nie powodują błędu, jeśli s może być listą ciągów, i dają Prawdę, jeśli łańcuch zaczyna się od KILKU cyfr.startswith
i nie wdrożyć go w ten sposób w moim kodzie. Dziękuję Ci.startswith(tuple(str(i) for i in range(10)))
Ten fragment kodu:
for s in ("fukushima", "123 is a number", ""): print s.ljust(20), s[0].isdigit() if s else False
wypisuje następujące informacje:
fukushima False 123 is a number True False
źródło
s[:1].isdigit()
lubs and s[0].isdigit()
s and s[0].isdigit()
jest moim zdaniem jeszcze mniej czytelny. Osobiście jak konstruktem ... jeśli ... else ... Biorąc pod uwagę Twoje uwagi, chciałbym po prostu poprawić go tak:s[0].isdigit() if s!="" else False
Zaskakujące, że po tak długim czasie nadal brakuje najlepszej odpowiedzi.
Wadą innych odpowiedzi jest użycie
[0]
do wybrania pierwszego znaku, ale jak wspomniano, powoduje to przerwanie pustego ciągu.Skorzystanie z poniższego omija ten problem i, moim zdaniem, daje najładniejszą i najbardziej czytelną składnię z dostępnych opcji. Również nie importuje / nie zawraca sobie głowy wyrażeniem regularnym):
>>> string = '1abc' >>> string[:1].isdigit() True >>> string = '' >>> string[:1].isdigit() False
źródło
Możesz również użyć
try...except
:try: int(string[0]) # do your stuff except: pass # or do your stuff
źródło
Oto moje „odpowiedzi” (staram się być tutaj wyjątkowy, nie polecam żadnego w tym konkretnym przypadku :-)
Za pomocą
ord () ispecjalnya <= b <= c
formularz://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'
(To
a <= b <= c
, jaka < b < c
jest specjalnym konstrukt Python i jest to rodzaj schludne porównanie1 < 2 < 3
(prawda) i1 < 3 < 2
(fałsz) i(1 < 3) < 2
(prawda), to nie jest to, jak to działa w większości innych języków.).Używając wyrażenia regularnego :
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
źródło
ord()
(2) Zgub^
w wyrażeniu regularnym.Możesz użyć wyrażeń regularnych .
Możesz wykryć cyfry za pomocą:
if(re.search([0-9], yourstring[:1])): #do something
Par [0-9] pasuje do dowolnej cyfry, a twój łańcuch [: 1] pasuje do pierwszego znaku twojego ciągu
źródło
Użyj wyrażeń regularnych , jeśli masz zamiar w jakiś sposób rozszerzyć funkcjonalność metody.
źródło
Spróbuj tego:
if string[0] in range(10):
źródło
range(10)
tworzy listę liczb całkowitych, podczas gdystring[0]
jest to ciąg o długości 1.if string[0] in map(str,range(10))
działa