यदि कोई स्ट्रिंग वर्णमाला के किसी अक्षर को शामिल करता है, तो मैं कैसे जांच सकता हूं?


86

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

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

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


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

क्या कोई मौका है कि आप यूनिकोड प्राप्त करेंगे? या सिर्फ सादा अस्सी का रोमन अक्षर?
कोबजोहन

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

1
इंग्लिश / z वर्णमाला तक केवल और केवल सादा इश्किया रोमन अक्षर :) तक सीमित है
जस्टिन पपीज

जवाबों:


124

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

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

1
धन्यवाद JBernado, यह वही है जो मैंने करना समाप्त कर दिया है और यह जो मुझे करने की आवश्यकता है, उसके लिए निर्दोष रूप से काम करता है।
जस्टिन पपेज़

36
रेगेक्स निश्चित रूप से थोड़ा ओवरकिल लगता है। any(c.isalpha() for c in string_1)स्वादिष्ट है पाइथोनिक।
जॉलीवेट

5
@ जोसेफ नहीं, यह नहीं है। यह रेगेक्स आपकी अभिव्यक्ति से कहीं अधिक पठनीय है। इसके अलावा, isalphaइसका क्या मतलब है? अजगर के साथ पायथन 2 की तुलना करते समय यह पूरी तरह से अलग व्यवहार होगा 3. चीनी वर्णमाला का हिस्सा है? यदि नहीं, तो आप नेत्रहीन इसे अपने जनरेटर के साथ पायथन 3 (यूनिकोड स्ट्रिंग्स के लिए पायथन 2!) पर मिलान कर रहे हैं!)। यदि आप पाइथोनिक चाहते हैं , तो यह है Simple is better than complex.:। और ऊपर ओपी की टिप्पणी की जांच करें: वह केवल रोमन वर्णमाला का मिलान करना चाहता है।
जेबरनार्डो

1
मुझे लगता है कि यूसुफ का जवाब पूरी तरह से पठनीय है और यह निश्चित रूप से एक अतिरिक्त आयात की तुलना में तेज़ है; इसके अलावा आपको पुनः खोज में तर्कों का क्रम याद रखने की ज़रूरत नहीं है
हिंटन

11
यदि कोई अन्य व्यक्ति सोच रहा है कि रिटर्न वैल्यू क्या है, तो आपको एक Matchवस्तु मिलती है यदि कोई मैच है, या Noneयदि नहीं है। तो यह एक if re.search(...पैटर्न के साथ संगत है ।
सीनि

78

कैसा रहेगा:

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

set(string_1)अधिक प्रभावशाली होगा ?
रिक पोग्गी

1
@Rik। इसका मतलब है कि यह परीक्षण करने से पहले आप स्ट्रिंग को एक सेट में परिवर्तित कर रहे हैं? नहीं यह अधिक कुशल नहीं होगा। यह गारंटी दी जाती है कि सभी वर्णों से निपटने के लिए कम से कम एक बार जब मेरा मानना ​​है कि किसी भी फ़ंक्शन में शॉर्ट सर्किट (स्टॉप) होगा, जब यह पहला गलत सामना करता है।
कोबजोहन

यह कोड कुछ धीमा होगा क्योंकि इसके लिए प्रति फंक्शन कॉल की आवश्यकता होती है। में कनवर्ट कर setसकता है या फ़ंक्शन कॉल को कम नहीं कर सकते हैं, लेकिन कुछ भूमि के ऊपर कहते हैं।
जेबरनार्डो

2
@ जेरनार्डो: समय का सुझाव है कि यह संकलित रेगेक्स की तुलना में परिमाण के क्रम के बारे में है और एक गैर-संकलित की तुलना में लगभग 66% अधिक समय लेता है। यह मेरी "मैं नियमित अभिव्यक्ति से नफरत करता हूं" सीमा के भीतर अच्छी तरह से है।
DSM

1
सुनिश्चित करें: और यदि आप "(555) .555-5555 ext। 5555" * 1000 का उपयोग करते हैं तो आप शॉर्ट-सर्कुलेटिंग के कारण तुलनीय गति पर वापस आ जाते हैं। मैं पायथन में नियमित रूप से लिखने के लिए लिखना पसंद करता हूं, जो मुझे कठिन लगता है जब तक कि वे तुच्छ नहीं हैं, और मैं स्पष्ट पायथन लिखने में हार नहीं मानूंगा जब तक कि प्रदर्शन आवश्यकताओं की मांग नहीं होती।
DSM

27

आप 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, जो आप चाहते हैं वह नहीं है।

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


3
मुझे पसंद है कि यह परीक्षण करेगा यदि यह पत्र, न कि केवल परीक्षण अगर इनपुट सभी पत्र हैं।
कॉर्नबीटल

@Cornbeetle हाँ, वास्तव में उस तरह उन वर्षों के बाद सभी सवाल का जवाब है, धन्यवाद
जीन फ़्राँस्वा Fabre

इसे लगाने का बहुत अच्छा तरीका है। दक्षता के मामले में यह कैसा है? रेगेक्स से बेहतर है?
pnv

कोई अजगर लूप शामिल नहीं हैं, इसलिए दक्षता अच्छी है। मैं संकलित करने के लिए कोई regex क्योंकि आरंभीकरण चरण के लिए विशेष रूप से regex के साथ तुलना नहीं की थी लेकिन मैं इसे थोड़ा तेज है लगता है,
जीन फ़्राँस्वा Fabre

13

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

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

8

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

import re

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

2

मैंने उपरोक्त विधियों में से प्रत्येक को यह खोजने के लिए परीक्षण किया है कि क्या कोई अक्षर किसी दिए गए स्ट्रिंग में समाहित है और एक मानक कंप्यूटर पर प्रति स्ट्रिंग औसत प्रसंस्करण समय पाया गया है।

~ 250 के लिए एन.एस.

import re

~ 3 µ के लिए

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

~ 6 for के लिए

any(c.isalpha() for c in string)

~ 850 ns के लिए

string.upper().isupper()


जैसा कि आरोप लगाया गया है, फिर से आयात करने पर नगण्य समय लगता है, और पुन: खोज करने के लिए लगभग आधे समय लगते हैं , क्योंकि यह अपेक्षाकृत छोटी स्ट्रिंग के लिए भी इलफ़्फ़ा () की पुनरावृत्ति करता है।
इसलिए बड़े तार और अधिक से अधिक संख्याओं के लिए, पुनः काफी अधिक कुशल होगा।

लेकिन एक मामले में स्ट्रिंग परिवर्तित करना और मामले की जांच करना (यानी ऊपरी (।) isupper) ( या निम्न (), islower () ) जीतता है। प्रत्येक लूप में यह re.search () की तुलना में काफी तेज होता है और इसके लिए किसी अतिरिक्त आयात की भी आवश्यकता नहीं होती है।


1
आप फरह्टर ऑप्टिमाइज़ेशन के लिए रेगेक्स को भी संकलित कर सकते हैं। Alpha_regex = re.compile ('[a-zA-Z]') बाद में Alpha_regex.search (string)
बेहदाद फ़ोरगनी

इसाल्फा का उल्लेख नहीं है () बहु भाषाओं के लिए अच्छी तरह से कसरत नहीं करता है। मैं इसकी तलाश कर रहा था क्योंकि मैं यह जांचना चाहता था कि क्या एक तार जो कोरियाई होने की उम्मीद है, उसमें कोई भी अंग्रेजी अक्षर और isalpha () विधि हर कोरियाई स्ट्रिंग के लिए सही है।
चैन वू

0

आप इसके अतिरिक्त भी कर सकते हैं

import re
string='24234ww'
val = re.search('[a-zA-Z]+',string) 
val[0].isalpha() # returns True if the variable is an alphabet
print(val[0]) # this will print the first instance of the matching value

यह भी ध्यान दें कि यदि वैरिएबल वाल कोई नहीं लौटाता है। इसका मतलब है कि खोज को एक मैच नहीं मिला

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.