Bagaimana cara mengetahui apakah string dimulai dengan angka dengan Python?

91

Saya memiliki string yang dimulai dengan angka (dari 0-9) Saya tahu saya bisa "atau" 10 kasus uji menggunakan startswith () tetapi mungkin ada solusi yang lebih rapi

jadi bukannya menulis

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

Apakah ada cara yang lebih pintar / lebih efisien?

Pemain sulap
sumber
Jika pertanyaan ditanyakan: "Apakah ini terlalu berulang?", Kemungkinan besar - dalam bahasa tingkat tinggi - jawabannya adalah "Mengapa, ya, pasti". Jadi malas!
42
Anda melewatkan string.startswith('1').
MAK
2
@Illusionist Seperti ada tertulis, pertanyaan Anda berarti Anda ingin mendeteksi string yang dimulai hanya dengan SATU digit. Jika demikian, jawaban yang hanya benar di antara yang berikut, bukan yang menggunakan s[0]atau s[:1]tapi solusi dari John Machin: if s.startswith(tuple('0123456789')). Selain itu, solusi ini menimbulkan kesalahan ketika terjadi bahwa s adalah urutan seperti tupel atau daftar, yang menghasilkan hasil yang sama seperti jika itu adalah string. - Solusi lain adalah regex yang polanya '\ d (? = \ D)' tetapi penggunaan regex berlebihan di sini.
eyquem
3
Hanya bertele-tele: stringadalah modul di pustaka standar dan mungkin tidak boleh digunakan sebagai nama variabel. docs.python.org/2/library/string.html
gak

Jawaban:

170

stringPerpustakaan Python memiliki isdigit()metode:

string[0].isdigit()
plaes
sumber
5
string Modul Python2 tidak memiliki metode, dan isdigitmerupakan metode strdan unicodeobjek.
John Machin
3
@plaes: -1 karena di atas PLUS itu macet jika s == ""
John Machin
3
Lihatlah jawaban saya yang tidak putus untuk string kosong:string[:1].isdigit()
PascalVKooten
24
>>> string = '1abc'
>>> string[0].isdigit()
True
jcomeau_ictx
sumber
Saya bukan orang python, jadi mungkin Anda dapat membantu saya dalam hal ini: akankah fungsi ini membom pada "", jika tidak ada string[0]?
corsiKa
ya, pasti akan. Anda dapat menggunakan (string atau 'x') [0] .isdigit () untuk memperbaikinya untuk '' atau None
jcomeau_ictx
30
Anda bisa mencoba string[:1].isdigit(), yang akan berhenti dengan senang hati berurusan dengan string kosong.
Simon Callan
2
karena itu bukan jawaban saya; milik saya masih lebih baik dalam kasus di mana pemrogram menginginkan pengecualian untuk dilemparkan pada string kosong.
jcomeau_ictx
1
@jcomeauictx tepat. tidak pernah memprogram secara defensif. jika string kosong secara tidak terduga, seharusnya error dan tidak ditangani secara otomatis. Beberapa aliran pemikiran mengatakan Anda harus menangani dan menangkap pengecualian yang tidak penting sebagai peringatan dan menjaga program tetap berjalan dengan baik. Saya bukan dari pola pikir ini untuk sebagian besar kasus penggunaan. Kekhususan dalam fungsi dan kode yang Anda tulis membantu mengurangi kasus edge di mana Anda perlu membuat kode lebih sering secara defensif.
jamescampbell
10

terkadang, Anda dapat menggunakan regex

>>> import re
>>> re.search('^\s*[0-9]',"0abc")
<_sre.SRE_Match object at 0xb7722fa8>
kurumi
sumber
berlebihan! Mengapa menggunakan re ketika Anda bisa melakukannya di bultins
Jakob Bowyer
1
@JakobBowyer Setidaknya, ada baiknya mengetahuinya! Meskipun dalam kasus ini, ya, regex ADALAH berlebihan jika beberapa bawaan dapat melakukan hal yang sama.
jeromej
8

Kode Anda tidak akan berfungsi; yang Anda butuhkan, orbukan ||.

Mencoba

'0' <= strg[:1] <= '9'

atau

strg[:1] in '0123456789'

atau, jika Anda benar-benar tergila-gila startswith,

strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
John Machin
sumber
Saya akan memberi suara positif jika hanya ada solusi dengan startswith (tuple) . Tetapi solusi dengan strg[:1]memiliki dua ketidaknyamanan: mereka tidak memunculkan kesalahan jika s mungkin merupakan daftar string, dan mereka menghasilkan True jika string dimulai dengan BEBERAPA digit.
eyquem
@eyquem mereka menghasilkan True jika string diawali dengan BEBERAPA digit Jadi? Jawaban lain tidak memeriksa itu, karena itu bukan persyaratan yang harus diperiksa bahwa karakter lain bukan numerik.
Rob Grant
Saya saya gila untuk startswithdan melakukan menerapkannya dengan cara ini dalam kode saya. Terima kasih.
jamescampbell
Satu lagi permulaan dengan kemungkinan ...startswith(tuple(str(i) for i in range(10)))
Jérôme
4

Potongan kode ini:

for s in ("fukushima", "123 is a number", ""):
    print s.ljust(20),  s[0].isdigit() if s else False

mencetak berikut ini:

fukushima            False
123 is a number      True
                     False
eyquem
sumber
4
Itu jelek. Gunakan s[:1].isdigit()ataus and s[0].isdigit()
John Machin
1
@ John Machin Apa yang Anda maksud dengan 'jelek'? Tidak terbaca ? Saya tidak menemukan proposisi Anda di atas lebih mudah dibaca. s and s[0].isdigit()bahkan kurang terbaca menurut saya. Secara pribadi, saya suka konstruksinya ... jika ... lain ... Mempertimbangkan komentar Anda, saya hanya akan memperbaikinya seperti itu:s[0].isdigit() if s!="" else False
eyquem
3

Mengejutkan bahwa setelah sekian lama masih ada jawaban terbaik yang hilang.

Kelemahan dari jawaban lain digunakan [0]untuk memilih karakter pertama, tetapi seperti yang dicatat, ini putus pada string kosong.

Menggunakan cara berikut mengatasi masalah ini, dan, menurut pendapat saya, memberikan sintaks yang tercantik dan paling mudah dibaca dari opsi yang kita miliki. Itu juga tidak mengimpor / mengganggu regex):

>>> string = '1abc'
>>> string[:1].isdigit()
True

>>> string = ''
>>> string[:1].isdigit()
False
PascalVKooten
sumber
2

Anda juga bisa menggunakan try...except:

try:
    int(string[0])
    # do your stuff
except:
    pass # or do your stuff
Satu Wajah
sumber
1

Ini adalah "jawaban" saya (mencoba menjadi unik di sini, saya sebenarnya tidak merekomendasikan keduanya untuk kasus khusus ini :-)

Menggunakan ord () dana <= b <= cbentuk khusus :

//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'

(Ini a <= b <= c, seperti a < b < c, adalah konstruksi Python khusus dan cukup rapi: bandingkan 1 < 2 < 3(true) dan 1 < 3 < 2(false) dan (1 < 3) < 2(true). Ini bukan cara kerjanya di sebagian besar bahasa lain.)

Menggunakan ekspresi reguler :

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

sumber
1
(1) Kalah ord()(2) Kalah ^di regex.
John Machin
0

Anda bisa menggunakan ekspresi reguler .

Anda dapat mendeteksi digit menggunakan:

if(re.search([0-9], yourstring[:1])):
#do something

Par [0-9] cocok dengan digit apa pun, dan string [: 1] cocok dengan karakter pertama string Anda

Tovi7
sumber
-2

Gunakan Ekspresi Reguler , jika Anda ingin memperluas fungsionalitas metode.

Ilya Smagin
sumber
-5

Coba ini:

if string[0] in range(10):
bradley.ayers
sumber
Ini tidak bekerja sama sekali. range(10)menghasilkan daftar bilangan bulat, sedangkan string[0]adalah string dengan panjang 1.
Petri Lehtinen
1
Itu tidak berhasil; jenisnya tidak cocok. Tapi: if string[0] in map(str,range(10))bekerja
phynfo