विशिष्ट वर्णों के लिए स्ट्रिंग की जांच कैसे करें? [बन्द है]


182

पायथन 2 का उपयोग करते हुए मैं कैसे जांच सकता हूं कि एक स्ट्रिंग में कई विशिष्ट वर्ण हैं?

उदाहरण के लिए, निम्नलिखित स्ट्रिंग दी गई है:

अपराधियों ने गहने में $ 1,000,000 चुरा लिया।

यदि मुझे डॉलर के चिह्न ("$"), अल्पविराम (","), और संख्याएँ मिलें तो मैं कैसे पता लगाऊँ?


1
क्या इसका मतलब है कि प्रत्येक वर्ण इनमें से एक माना जाता है, या क्या यह पर्याप्त है कि इन वर्णों में से एक (या सभी) स्ट्रिंग में मौजूद है? क्या उन्हें कुछ आदेश में होना चाहिए (जैसे: $ 2,00) इसके लिए वैध होना चाहिए?
NullUserException

2
बस एक अलग प्रकार के दृष्टिकोण के रूप में, परीक्षण करने के लिए स्ट्रिंग not set(p).isdisjoint(set("0123456789$,"))कहां pहै।
केविन

जवाबों:


265

मान लें कि आपकी स्ट्रिंग है s:

'$' in s        # found
'$' not in s    # not found

# original answer given, but less Pythonic than the above...
s.find('$')==-1 # not found
s.find('$')!=-1 # found

और इसलिए अन्य पात्रों के लिए।

... या

pattern = re.compile(r'\d\$,')
if pattern.findall(s):
    print('Found')
else
    print('Not found')

... या

chars = set('0123456789$,')
if any((c in chars) for c in s):
    print('Found')
else:
    print('Not Found')

[संपादित करें: '$' in sउत्तर जोड़े ]


20
s.find('$')!=-1=> '$' in s:-)
जोचेन रिट्जेल

क्या कोई विशेष कारण है कि नहीं मिला मूल्य -1 और 0 नहीं रखा गया था ??
अक्की

2
@akki नहीं मिला -1 है क्योंकि 0 एक स्ट्रिंग में पहले वर्ण का सूचकांक है। इस प्रकार "abc" .find ('a') = 0. यह अस्पष्ट होगा यदि 0 भी मान नहीं पाया गया।
लम्बी

1
मुझे वह आखिरी संस्करण पसंद है any()। क्या cपायथोनिक शैली में पाए गए चरित्र को संदर्भित करने का एक तरीका है (यह any()केवल अंदर से स्कूप किया गया लगता है ), या मुझे कई पात्रों की खोज को और अधिक स्पष्ट करने की आवश्यकता होगी?
जेन्स

3
दूसरा उदाहरण टूट गया है: रेगेक्स को कोष्ठक की आवश्यकता है r'[\d\$,]'इसलिए यह उन पात्रों में से किसी से मेल खाता है, और else:अंत में बृहदान्त्र गायब है।
बोजनॉर्ड

23

उपयोगकर्ता जोचेन रिट्जेल ने यूजर डैप्पावेट के इस प्रश्न के उत्तर के लिए एक टिप्पणी में यह बात कही। यह काम करना चाहिए:

('1' in var) and ('2' in var) and ('3' in var) ...

'1', '2', आदि को उन पात्रों से बदला जाना चाहिए जिन्हें आप ढूंढ रहे हैं।

पायथन 2.7 में यह पृष्ठ देखें स्ट्रिंग पर कुछ जानकारी के inलिए, टेस्टिंग के लिए ऑपरेटर के उपयोग के बारे में ।

अपडेट: यह वही काम करता है जो मेरे उपरोक्त सुझाव के साथ कम पुनरावृत्ति के साथ होता है:

# When looking for single characters, this checks for any of the characters...
# ...since strings are collections of characters
any(i in '<string>' for i in '123')
# any(i in 'a' for i in '123') -> False
# any(i in 'b3' for i in '123') -> True

# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
# any(i in 'hello' for i in ('18','36','613')) -> False
# any(i in '613 mitzvahs' for i in ('18','36','613')) ->True

+1 यह कई .find () की तुलना में अधिक कॉम्पैक्ट है, और जब तक खोजे गए वर्णों की संख्या कम है, तब तक ठीक है। हालांकि कोष्ठकों की जरूरत नहीं है।
सीन

1
@ माता-पिता के बारे में झुकना: मुझे पता है, हालांकि मेरे लिए हमेशा उनका उपयोग करना आसान है, हमेशा पूर्ववर्ती आदेश को याद रखने की तुलना में :-)।
अबाफेई

11

अब्बाफी द्वारा पोस्ट के जवाब में समय की त्वरित तुलना:

import timeit

def func1():
    phrase = 'Lucky Dog'
    return any(i in 'LD' for i in phrase)

def func2():
    phrase = 'Lucky Dog'
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__': 
    func1_time = timeit.timeit(func1, number=100000)
    func2_time = timeit.timeit(func2, number=100000)
    print('Func1 Time: {0}\nFunc2 Time: {1}'.format(func1_time, func2_time))

आउटपुट:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

तो कोड किसी के साथ अधिक कॉम्पैक्ट है, लेकिन सशर्त के साथ तेजी से।


संपादित करें: टीएल; डीआर - लंबे तारों के लिए, यदि-तब भी किसी की तुलना में बहुत तेज है!

मैंने टिप्पणियों में उठाए गए कुछ मान्य बिंदुओं के आधार पर एक लंबे यादृच्छिक स्ट्रिंग के लिए समय की तुलना करने का निर्णय लिया:

# Tested in Python 2.7.14

import timeit
from string import ascii_letters
from random import choice

def create_random_string(length=1000):
    random_list = [choice(ascii_letters) for x in range(length)]
    return ''.join(random_list)

def function_using_any(phrase):
    return any(i in 'LD' for i in phrase)

def function_using_if_then(phrase):
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__':
    random_string = create_random_string(length=2000)
    func1_time = timeit.timeit(stmt="function_using_any(random_string)",
                               setup="from __main__ import function_using_any, random_string",
                               number=200000)
    func2_time = timeit.timeit(stmt="function_using_if_then(random_string)",
                               setup="from __main__ import function_using_if_then, random_string",
                               number=200000)
    print('Time for function using any: {0}\nTime for function using if-then: {1}'.format(func1_time, func2_time))

आउटपुट:

Time for function using any: 0.1342546
Time for function using if-then: 0.0201827

यदि-तब लगभग किसी भी की तुलना में तेजी से परिमाण का क्रम है!


1
वास्तव में मैं क्या जानना चाहता था :-)
लार्स

1
कोई भी यह समझाने में सक्षम है कि सशर्त किसी का उपयोग करने की तुलना में बहुत तेज क्यों है?
जोश

@ जोश शायद इसलिए है क्योंकि इसकी सरलता है। Func1 विस्फोट सूची समझ का उपयोग करता है इसलिए यह स्वचालित रूप से सरल चीजों के लिए और अधिक जटिल है। लेकिन 1000 वर्णों के लिए, यह फन 1
हैक 5

@ Hack5 phraseA से Z तक के अल्फाबेट्स के साथ एक स्ट्रिंग का अनुमान लगाता है और मैं प्रिंट करना चाहता हूं कि कौन से अल्फाबेट्स एक साथ मौजूद नहीं हैं, स्ट्रिंग any()बेहतर इस्तेमाल करेंगे ? या जाँच करने के लिए कोई छोटा रास्ता है?
अविषेक दत्ता रे

@ उस स्तर पर बेयरफेड, जो भी अच्छा लग रहा है उठाओ। गति शायद मायने नहीं रखती है, जब तक कि आप
नुक्सेस को

5

यह परीक्षण करेगा यदि तार कुछ संयोजन या अंकों, डॉलर के संकेत और अल्पविराम से बने होते हैं। कि तुम क्या देख रहे हो?

आयात फिर से

s1 = 'परीक्षण स्ट्रिंग'
s2 = '1234,12345 $'

regex = re.compile ('[0-9, $] + $')

अगर (regex.match (s1)):
   प्रिंट "s1 मिलान"
अन्य:
   प्रिंट "s1 मेल नहीं खाता"

अगर (regex.match (s2)):
   प्रिंट "s2 मिलान"
अन्य:
   प्रिंट "s2 मेल नहीं खाता"

यदि आपको वर्ण वर्ग में है तो आपको $ बचना नहीं है। यह भी मेल खाएगा 'testing $tring', जो मुझे नहीं लगता कि कुछ ऐसा है जो ओपी चाहता है।
NullUserException

यदि मुझे सही तरीके से याद है, तो यह मेल नहीं खाएगा 'testing $tring'यदि matchविधि का उपयोग किया जाता है, केवल अगर searchइसका उपयोग किया जाता है। इसलिए मुझे लगता है कि उसका कोड ठीक है।
dappawit

@dappa यह अभी भी मिलान कर देंगे '$string', हालांकि
NullUserException

-2
s=input("Enter any character:")   
if s.isalnum():   
   print("Alpha Numeric Character")   
   if s.isalpha():   
       print("Alphabet character")   
       if s.islower():   
         print("Lower case alphabet character")   
       else:   
         print("Upper case alphabet character")   
   else:   
     print("it is a digit")   
elif s.isspace():   
    print("It is space character")   

और:
प्रिंट ("नॉन स्पेस स्पेशल कैरेक्टर")


1
क्या आप कृपया अपने उत्तर के लिए थोड़ा और संदर्भ प्रदान कर सकते हैं।
पीतल बंदर

किसी स्ट्रिंग में मौजूद वर्णों की जाँच करना: isalnum (): रिटर्न सही है यदि सभी वर्ण अल्फ़ान्यूमेरिक हैं (a से z, A से Z, 0 to9) isalpha (): रिटर्न सही है यदि सभी वर्ण केवल वर्णानुक्रम चिह्न (z से z) हैं A to Z), isdigit (): रिटर्न ट्रू यदि सभी वर्ण केवल अंक (0 से 9) islower () हैं: यदि सभी वर्ण कम हैं तो रिटर्न सही है वर्णमाला के प्रतीकों isupper (): सभी वर्ण ऊपरी केस aplhabet के प्रतीक हैं तो सही है istitle (): रिटर्न यह सच है, तो स्ट्रिंग शीर्षक मामले isspace () में है: रिटर्न यह सच है, तो स्ट्रिंग केवल रिक्त स्थान @LazerBass शामिल
नागराज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.