कैसे बताएं कि क्या स्ट्रिंग पायथन के साथ एक संख्या से शुरू होती है?


91

मेरे पास एक स्ट्रिंग है जो एक नंबर से शुरू होती है (0-9 से) मुझे पता है कि मैं "या" 10 टेस्ट केस शुरू कर सकता हूं।

इसलिए लिखने के बजाय

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

क्या कोई चतुर / अधिक कुशल तरीका है?


यदि प्रश्न पूछा जाता है: "क्या यह भी दोहराव है?", संभावनाएं हैं - एक उच्च स्तरीय भाषा में - उत्तर "क्यों, हां, यह सुनिश्चित है"। आलसी रहो!

42
तुम चूक गए string.startswith('1')
MAK

2
@Illusionist जैसा कि यह लिखा गया है, आपके प्रश्न का अर्थ है कि आप केवल एक अंक से शुरू होने वाले तारों का पता लगाना चाहते हैं। यदि ऐसा है, तो निम्नलिखित लोगों के बीच एकमात्र सही उत्तर, जॉन माचिन का उपयोग s[0]या उपयोग करने वाले नहीं हैं :। इसके अलावा, यह समाधान त्रुटि को जन्म देता है जब ऐसा होता है कि एस एक अनुक्रम है जैसे कि एक टपल या सूची, जो मामले उसी परिणाम का उत्पादन करते हैं जैसे कि यह एक स्ट्रिंग था। - एक अन्य समाधान एक रेगेक्स है जिसका पैटर्न '\ d (? = \ D)' है, लेकिन रेगेक्स का उपयोग यहां बहुत ही अच्छा है। s[:1]if s.startswith(tuple('0123456789'))
आईक्यू

3
बस पांडित्यपूर्ण होना: stringमानक पुस्तकालय में एक मॉड्यूल है और शायद इसे एक चर नाम के रूप में उपयोग नहीं किया जाना चाहिए। docs.python.org/2/library/string.html
gak

जवाबों:


170

पायथन की stringलाइब्रेरी में isdigit()विधि है:

string[0].isdigit()

5
Python2 के string मॉड्यूल में विधियां नहीं हैं, और वस्तुओं और वस्तुओं isdigitकी एक विधि है । strunicode
जॉन माचिन

3
@plaes: -1 उपरोक्त प्लस के कारण यह दुर्घटनाग्रस्त होता है अगर s == ""
जॉन माकिन

3
मेरे उत्तर को देखें जो एक खाली स्ट्रिंग के लिए नहीं टूटता है:string[:1].isdigit()
पास्कलवूटेन

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

मैं अजगर आदमी नहीं हूं, इसलिए शायद आप इस पर मेरी मदद कर सकते हैं: क्या यह फ़ंक्शन "" पर बम होगा, जहां कोई नहीं है string[0]?
corsiKa

हां, यह निश्चित है। आप (स्ट्रिंग या 'x') का उपयोग कर सकते हैं [0] .isdigit () इसे 'या' के लिए ठीक करने के लिए
jcomeau_ictx

30
आप कोशिश कर सकते हैं string[:1].isdigit(), जो खाली स्ट्रिंग के साथ खुशी से सौदा करेगा।
साइमन कॉलन

2
क्योंकि वह मेरा उत्तर नहीं है; मेरा उस मामले में अभी भी बेहतर है जहां प्रोग्रामर एक अपवाद को खाली स्ट्रिंग पर फेंकना चाहता है।
jcomeau_ictx

1
@jcomeau_ictx बिल्कुल सही। रक्षात्मक कार्यक्रम कभी नहीं। यदि स्ट्रिंग अप्रत्याशित रूप से खाली है, कि चाहिए बाहर त्रुटि और स्वचालित रूप से वैसे भी नहीं संभाला जाना चाहिए। विचार के कुछ स्कूलों का कहना है कि आपको सावधानीपूर्वक संभालना चाहिए और अपवादों को पकड़ना चाहिए जो चेतावनी के रूप में महत्वपूर्ण नहीं हैं और कार्यक्रम को जारी रखें। मैं ज्यादातर उपयोग के मामलों के लिए इस मानसिकता का नहीं हूं। आपके द्वारा लिखे जा रहे कार्यों और कोड में विशिष्टता उन किनारे के मामलों को कम करने में मदद करती है जहां आपको रक्षात्मक रूप से अधिक बार कोड करने की आवश्यकता होगी।
jamescampbell

10

कभी-कभी, आप रेगेक्स का उपयोग कर सकते हैं

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

overkill! जब आप इसे बुल्टिंस में कर सकते हैं, तो फिर से उपयोग क्यों करें
जैकब बोएयर

1
@JakobBowyer कम से कम, इसके बारे में जानना अच्छा है! भले ही इस मामले में, हाँ, रेगीक्स ओवरकिल हैं अगर कुछ बिल्डिन ऐसा कर सकते हैं।
जेरोमज

8

आपका कोड काम नहीं करेगा; आप की जरूरत orके बजाय ||

प्रयत्न

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

या

strg[:1] in '0123456789'

या, अगर तुम सच में पागल हो startswith,

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

अगर स्टार्टविथ (टुपल) के साथ केवल समाधान होता तो मैं आपको उखाड़ फेंकता । लेकिन strg[:1]दो असुविधाओं के साथ समाधान : वे एक त्रुटि नहीं बढ़ाते हैं यदि एस स्ट्रिंग की एक सूची हो सकती है, और वे सही उत्पन्न करते हैं यदि स्ट्रिंग सीवर अंकों से शुरू होती है।
11

@ क्या वे सही उत्पादन करते हैं यदि स्ट्रिंग सीवर अंकों के साथ शुरू होती है तो? अन्य उत्तर उसके लिए जाँच नहीं करते हैं, क्योंकि यह आवश्यकता नहीं थी कि उसे यह जाँचना था कि अन्य वर्ण संख्यात्मक नहीं थे।
रोब ग्रांट

मैं कर रहा हूँ के लिए पागल हो startswithऔर यह मेरे कोड में इस तरह से लागू किया था। धन्यवाद।
jamescampbell

एक और शुरुआत की संभावना ...startswith(tuple(str(i) for i in range(10)))
जेरोम

4

इस कोड का टुकड़ा:

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

निम्नलिखित प्रिंट करता है:

fukushima            False
123 is a number      True
                     False

4
वह बदसूरत है। उपयोग करें s[:1].isdigit()याs and s[0].isdigit()
जॉन माकिन

1
@ जॉन माचिन 'बदसूरत' से आपका क्या अभिप्राय है? पठनीय नहीं ? मुझे आपके प्रस्ताव यहां अधिक पठनीय नहीं लगे। s and s[0].isdigit()मेरी राय में भी कम पठनीय है। व्यक्तिगत रूप से, मुझे निर्माण पसंद है ... अगर ... और ... आपकी टिप्पणी का ध्यान रखते हुए, मैं इसे बस ऐसे ही सुधार s[0].isdigit() if s!="" else False
दूंगा

3

हैरानी की बात है कि इतने लंबे समय के बाद अभी भी सबसे अच्छा जवाब गायब है।

अन्य उत्तरों का नकारात्मक पक्ष [0]पहले चरित्र का चयन करने के लिए उपयोग कर रहा है, लेकिन जैसा कि नोट किया गया है, यह खाली स्ट्रिंग पर टूट जाता है।

निम्नलिखित समस्या का उपयोग करके इस समस्या को और, मेरी राय में, हमारे पास मौजूद विकल्पों में सबसे सुंदर और सबसे पठनीय वाक्य-विन्यास है। यह भी regex के साथ आयात / परेशान नहीं करता है):

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

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

2

आप यह भी उपयोग कर सकते हैं try...except:

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

1

यहां मेरे "उत्तर" हैं (यहां अद्वितीय होने की कोशिश कर रहा हूं, मैं वास्तव में इस विशेष मामले के लिए सिफारिश नहीं करता हूं :-)

का उपयोग करते हुए ord () औरविशेष a <= b <= cरूप:

//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 <= c, जैसे a < b < c, एक विशेष पायथन निर्माण है और यह साफ-सुथरा है: तुलना 1 < 2 < 3(सत्य) और 1 < 3 < 2(असत्य) और (1 < 3) < 2(सत्य)। यह ऐसा नहीं है जो अन्य अधिकांश भाषाओं में काम करता है।)

एक नियमित अभिव्यक्ति का उपयोग करना :

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
(१) लूज ord()२ (२) ^रेगेक्स में खो जाना ।
जॉन माचिन

0

आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं ।

आप अंक का उपयोग करके पता लगा सकते हैं:

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

[0-9] बराबर किसी भी अंक से मेल खाता है, और आपका स्ट्रिंग [: 1] आपके स्ट्रिंग के पहले चरित्र से मेल खाता है



-5

इसे इस्तेमाल करे:

if string[0] in range(10):

यह बिल्कुल काम नहीं करता है। range(10)पूर्णांक की एक सूची तैयार करता है, जबकि string[0]लंबाई 1 की एक स्ट्रिंग है।
पेट्री लेह्टिनन

1
वह काम नहीं करता है; प्रकार न मेल खाते हैं। लेकिन: if string[0] in map(str,range(10))काम करता है
phynfo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.