2012-01-31 23 views
44

यह जांचने के लिए सबसे अच्छा शुद्ध पायथन कार्यान्वयन क्या है कि किसी स्ट्रिंग में वर्णमाला से कोई अक्षर है या नहीं?मैं कैसे जांच सकता हूं कि किसी स्ट्रिंग में वर्णमाला से कोई अक्षर है या नहीं?

string_1 = "(555).555-5555" 
string_2 = "(555) 555 - 5555 ext. 5555 

कहाँ string_1 उस में वर्णमाला का कोई पत्र होने के लिए False वापसी होगी और string_2 पत्र होने के लिए True लौट आते हैं।

+1

क्या यह केवल अंग्रेजी ए/जेड वर्णमाला तक सीमित होना चाहिए? क्या जर्मन के जैसे अन्य अक्षरों से 'विशेष' वर्णों को ध्यान में रखा जाना चाहिए? – Kotch

+0

क्या कोई मौका है कि आपको यूनिकोड प्राप्त होगा? या सिर्फ सादा ascii रोमन पत्र? – KobeJohn

+0

अच्छा समय वहाँ :) वैसे भी, अगर आपको यूनिकोड वर्णों के साथ स्ट्रिंग का परीक्षण करने में मदद की ज़रूरत है तो यह वही प्रश्न देखें। – KobeJohn

उत्तर

66

Regex एक तेजी से दृष्टिकोण होना चाहिए:

re.search('[a-zA-Z]', the_string) 
+1

धन्यवाद जेबर्नैडो, मैं यही कर रहा हूं और यह मुझे जो करना है उसके लिए यह बेकार ढंग से काम करता है। –

+4

@ जस्टिनपेपज़ आपको इस जवाब को स्वीकार करना चाहिए ... – sadmicrowave

+0

ओह, मैं पूरी तरह से भूल गया, अनुस्मारक के लिए धन्यवाद। –

49

कैसे के बारे में:

>>> string_1 = "(555).555-5555" 
>>> string_2 = "(555) 555 - 5555 ext. 5555" 
>>> any(c.isalpha() for c in string_1) 
False 
>>> any(c.isalpha() for c in string_2) 
True 
+0

'सेट (स्ट्रिंग_1)' अधिक प्रभावशाली होगा? –

+1

@ रिक। क्या आप स्ट्रिंग_1 को परीक्षण करने से पहले एक सेट में कनवर्ट करना चाहते हैं? नहीं, यह अधिक कुशल नहीं होगा। यह कम से कम एक बार सभी पात्रों से निपटने की गारंटी है, जबकि मेरा मानना ​​है कि किसी भी समारोह में शॉर्ट सर्किट (स्टॉप) होगा जब यह पहली झूठ का सामना करेगा। – KobeJohn

+0

यह कोड कुछ हद तक धीमा होगा क्योंकि इसे प्रति चार फ़ंक्शन कॉल की आवश्यकता होती है। 'सेट' में कनवर्ट करना फ़ंक्शन कॉल को कम या नहीं कर सकता है, लेकिन कुछ ओवरहेड जोड़ता है। – JBernardo

8

आप इस तरह रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

import re 

print re.search('[a-zA-Z]+',string) 
9

आप अपने स्ट्रिंग पर islower() उपयोग कर सकते हैं यह देखने के लिए कि इसमें कुछ लोअरकेस अक्षर हैं (अन्य पात्रों के साथ)। or यह isupper() साथ भी जांच करने के लिए करता है, तो कुछ बड़े अक्षरों में शामिल हैं:

नीचे

: पत्र स्ट्रिंग में: परीक्षण पैदावार सच

>>> z = "(555) 555 - 5555 ext. 5555" 
>>> z.isupper() or z.islower() 
True 
नीचे

: स्ट्रिंग में कोई पत्र: परीक्षण पैदावार झूठी।

>>> z= "(555).555-5555" 
>>> z.isupper() or z.islower() 
False 
>>> 

नहीं अप isalpha() जो True पत्र केवल अगर सब चरित्र देता है, जो नहीं है कि आप क्या चाहते के साथ मिश्रित किया जाना है।

ध्यान दें कि बार्म उत्तर अच्छी तरह से मेरा पूरा करता है, क्योंकि मेरा मिश्रित मामला अच्छी तरह से संभाल नहीं करता है।

+1

के साथ संगत है, मुझे यह पसंद है कि यह जांच करेगा अगर यह पत्र शामिल है, न केवल इनपुट के सभी इनपुट होने पर परीक्षण करें। – Cornbeetle

+0

@ कॉर्नबीटल हाँ, वास्तव में इसका जवाब वास्तव में उन सभी वर्षों के बाद सवाल, धन्यवाद –

2

मुझे @ जीन-फ्रैंकोइस-fabre द्वारा प्रदान किया गया उत्तर पसंद आया, लेकिन यह अपूर्ण है।
उनका दृष्टिकोण काम करेंगे, लेकिन तभी जब पाठ विशुद्ध रूप से निचले या बड़े अक्षरों में शामिल हैं:

>>> text = "(555).555-5555 extA. 5555" 
>>> text.islower() 
False 
>>> text.isupper() 
False 

बेहतर दृष्टिकोण पहले ऊपरी या अपने स्ट्रिंग लोअरकेस और उसके बाद जाँच करने के लिए है।

>>> string1 = "(555).555-5555 extA. 5555" 
>>> string2 = '555 (234) - 123.32 21' 

>>> string1.upper().isupper() 
True 
>>> string2.upper().isupper() 
False 
संबंधित मुद्दे

 संबंधित मुद्दे