Làm thế nào để biết nếu chuỗi bắt đầu bằng một số với Python?


91

Tôi có một chuỗi bắt đầu bằng một số (từ 0-9) Tôi biết tôi có thể "hoặc" 10 trường hợp thử nghiệm sử dụng startwith () nhưng có lẽ có một giải pháp gọn gàng hơn

vì vậy thay vì viết

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

Có cách nào thông minh hơn / hiệu quả hơn không?


Nếu câu hỏi được đặt ra: "Điều này có lặp đi lặp lại quá không?", Rất có thể - theo ngôn ngữ cấp cao - câu trả lời là "Tại sao, có, chắc chắn là như vậy". Hãy lười biếng!

42
Bạn đã trượt string.startswith('1').
MAK

2
@Illusionist Như đã viết, câu hỏi của bạn có nghĩa là bạn muốn phát hiện các chuỗi chỉ bắt đầu bằng MỘT chữ số. Nếu vậy, câu trả lời chỉ đúng trong số những người sau đây, không phải là những sử dụng s[0]hoặc s[:1]nhưng các giải pháp của John Machin: if s.startswith(tuple('0123456789')). Hơn nữa, giải pháp này gây ra lỗi khi xảy ra rằng s là một chuỗi giống như một tuple hoặc danh sách, các trường hợp này tạo ra kết quả giống như thể nó là một chuỗi. - Một giải pháp khác là một regex có mẫu là '\ d (? = \ D)' nhưng việc sử dụng regex là thừa ở đây.
sát

3
Just be pedantic: stringlà một mô-đun trong thư viện chuẩn và có lẽ không nên được sử dụng như một tên biến. docs.python.org/2/library/string.html
Gak

Câu trả lời:


170

stringThư viện của Python có isdigit()phương thức:

string[0].isdigit()

5
string Mô-đun của Python2 không có các phương thức và isdigitlà một phương thức của strunicodecác đối tượng.
John Machin

3
@plaes: -1 vì những điều trên PLUS nó bị treo nếu s == ""
John Machin

3
Hãy xem câu trả lời của tôi không bị đứt đối với một chuỗi trống:string[:1].isdigit()
PascalVKooten

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

Tôi không phải là một người yêu thích python, vì vậy có lẽ bạn có thể giúp tôi điều này: chức năng này sẽ đánh bom trên "", nơi không có string[0]?
corsiKa

vâng, nó chắc chắn sẽ. bạn có thể sử dụng (string hoặc 'x') [0] .isdigit () để sửa chữa nó cho '' hoặc None
jcomeau_ictx

30
Bạn có thể thử string[:1].isdigit(), điều này sẽ vui vẻ giải quyết một chuỗi rỗng.
Simon Callan

2
bởi vì đó không phải là câu trả lời của tôi; của tôi vẫn tốt hơn trong trường hợp lập trình viên muốn một ngoại lệ được ném vào một chuỗi trống.
jcomeau_ictx

1
@jcomeau_ictx chính xác là đúng. không bao giờ có chương trình phòng thủ. nếu chuỗi trống bất ngờ, điều đó sẽ xảy ra lỗi và không nên tự động xử lý. Một số trường phái tư tưởng cho rằng bạn nên xử lý khéo léo và nắm bắt các trường hợp ngoại lệ không quan trọng như cảnh báo và giữ cho chương trình tiếp tục. Tôi không có suy nghĩ này cho hầu hết các trường hợp sử dụng. Tính cụ thể trong các chức năng và mã bạn đang viết giúp giảm thiểu các trường hợp phức tạp mà bạn sẽ cần viết mã phòng thủ thường xuyên hơn.
jamescampbell

10

đôi khi, bạn có thể sử dụng regex

>>> import re
>>> re.search('^\s*[0-9]',"0abc")
<_sre.SRE_Match object at 0xb7722fa8>

quá mức cần thiết! Tại sao lại sử dụng re khi bạn có thể làm điều đó trong nhiều kỳ
Jakob Bowyer

1
@JakobBowyer Ít nhất, thật tốt khi biết về nó! Mặc dù trong trường hợp này, vâng, regexes là quá mức cần thiết nếu một số nội trang có thể làm như vậy.
jeromej

8

Mã của bạn sẽ không hoạt động; bạn cần orthay vì ||.

Thử

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

hoặc là

strg[:1] in '0123456789'

hoặc, nếu bạn thực sự phát cuồng vì startswith,

strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))

Tôi sẽ ủng hộ bạn nếu chỉ có giải pháp với startwith (một tuple) . Nhưng các giải pháp strg[:1]có hai điểm bất tiện: chúng không gây ra lỗi nếu s có thể là danh sách các chuỗi và chúng tạo ra True nếu chuỗi bắt đầu bằng chữ số SEVERAL.
sát

@eyquem họ tạo ra True nếu chuỗi bắt đầu bằng SEVERAL chữ số Vậy? Các câu trả lời khác không kiểm tra điều đó, bởi vì nó không bắt buộc phải kiểm tra xem các ký tự khác không phải là số.
Rob Grant

Tôi rất cuồng nhiệt startswithvà đã thực hiện nó theo cách này trong mã của mình. Cảm ơn bạn.
jamescampbell

Thêm một startswith khả năng ...startswith(tuple(str(i) for i in range(10)))
Jérôme

4

Đoạn mã này:

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

in ra những thứ sau:

fukushima            False
123 is a number      True
                     False

4
Thật là xấu xa. Sử dụng s[:1].isdigit()hoặcs and s[0].isdigit()
John Machin

1
@John Machin Bạn có nghĩa là gì khi 'xấu xí'? Không thể đọc được ? Tôi không thấy đề xuất của bạn ở đây ở trên dễ đọc hơn. s and s[0].isdigit()theo quan điểm của tôi thậm chí còn ít đọc hơn. Cá nhân, tôi như xây dựng ... if ... else ... Lấy tài khoản của nhận xét của bạn, tôi sẽ chỉ cải thiện nó như thế:s[0].isdigit() if s!="" else False
Eyquem

3

Ngạc nhiên là sau một thời gian dài vẫn còn thiếu câu trả lời hay nhất.

Nhược điểm của các câu trả lời khác là sử dụng [0]để chọn ký tự đầu tiên, nhưng như đã lưu ý, điều này sẽ ngắt trên chuỗi trống.

Việc sử dụng các phương pháp sau đây sẽ giải quyết được vấn đề này, và theo tôi, đưa ra cú pháp đẹp nhất và dễ đọc nhất trong số các tùy chọn mà chúng tôi có. Nó cũng không nhập / bận tâm với regex):

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

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

2

Bạn cũng có thể sử dụng try...except:

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

1

Đây là "câu trả lời" của tôi (cố gắng trở thành duy nhất ở đây, tôi cũng không thực sự đề xuất cho trường hợp cụ thể này :-)

Sử dụng ord ()a <= b <= cdạng đặc biệt :

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

( a <= b <= cGiống như a < b < c, đây là một cấu trúc Python đặc biệt và nó khá gọn gàng: so sánh 1 < 2 < 3(true) và 1 < 3 < 2(false) và (1 < 3) < 2(true). Đây không phải là cách nó hoạt động trong hầu hết các ngôn ngữ khác.)

Sử dụng một biểu thức chính quy :

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

1
(1) Mất ord()(2) Mất ^trong regex.
John Machin

0

Bạn có thể sử dụng biểu thức chính quy .

Bạn có thể phát hiện các chữ số bằng cách sử dụng:

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

Mệnh [0-9] khớp với bất kỳ chữ số nào và chuỗi yourstring [: 1] khớp với ký tự đầu tiên trong chuỗi của bạn



-5

Thử đi:

if string[0] in range(10):

Điều này không hoạt động ở tất cả. range(10)tạo ra một danh sách các số nguyên, trong khi string[0]là một chuỗi có độ dài 1.
Petri Lehtinen

1
Điều đó không hoạt động; các loại không phù hợp. Nhưng: if string[0] in map(str,range(10))hoạt động
phynfo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.