सवाल क्या पाइथन में स्ट्रिंग 'युक्त' सबस्ट्रिंग विधि है?


मैं तलाश कर रहा हूं एक string.contains या string.indexof पायथन में विधि।

मैं करना चाहता हूँ:

if not somestring.contains("blah"):
   continue

2885
2017-08-09 02:52


मूल




जवाब:


आप इसका उपयोग कर सकते हैं in ऑपरेटर:

if "blah" not in somestring: 
    continue

4372
2017-08-09 02:56





यदि यह केवल एक सबस्ट्रिंग खोज है जिसका आप उपयोग कर सकते हैं string.find("substring")

आपको थोड़ा सावधान रहना होगा find, index, तथा in हालांकि, क्योंकि वे खोजों को प्रतिस्थापित कर रहे हैं। दूसरे शब्दों में, यह:

s = "This be a string"
if s.find("is") == -1:
    print "No 'is' here!"
else:
    print "Found 'is' in the string."

यह प्रिंट करेगा Found 'is' in the string. इसी तरह, if "is" in s: का मूल्यांकन करेंगे True। यह हो सकता है कि आप जो चाहें हो या न हो।


460
2017-08-09 02:55



Substring खोजों में शामिल गठिया को हाइलाइट करने के लिए +1। स्पष्ट समाधान है if ' is ' in s: जो वापस आ जाएगा False जैसा कि (संभवतः) अपेक्षित है। - aaronasterling
@Aaronasterling स्पष्ट यह हो सकता है, लेकिन पूरी तरह से सही नहीं है। क्या होगा यदि आपके पास विराम चिह्न है या यह शुरुआत या अंत में है? पूंजीकरण के बारे में क्या? बेहतर एक मामला असंवेदनशील regex खोज होगा \bis\b (शब्द सीमाएं)। - Bob
@JamieBull एक बार फिर, आपको यह समझना चाहिए कि क्या आप किसी शब्द के लिए विराम चिह्न के रूप में विराम चिह्न शामिल करना चाहते हैं। विभाजन के लिए जांच के निष्पक्ष समाधान के रूप में बड़े पैमाने पर एक ही प्रभाव होगा ' is ', विशेष रूप से, यह पकड़ नहीं होगा This is, a comma' या 'It is.'। - Bob
@ जैमीबुल: मुझे किसी भी वास्तविक इनपुट के साथ विभाजित करने में अत्यधिक संदेह है s.split(string.punctuation + string.whitespace) एक बार भी विभाजित होगा; split की तरह नहीं है strip/rstrip/lstrip कार्यों के परिवार, यह केवल तब विभाजित होता है जब यह सभी सटीक क्रम में, सभी डेलीमीटर वर्णों को देखता है। यदि आप चरित्र वर्गों पर विभाजित करना चाहते हैं, तो आप नियमित अभिव्यक्तियों पर वापस आ गए हैं (जिस बिंदु पर, खोज रहे हैं r'\bis\b' बिना विभाजन के सरल, तेज़ तरीका जाना है)। - ShadowRanger
'is' not in (w.lower() for w in s.translate(string.maketrans(' ' * len(string.punctuation + string.whitespace), string.punctuation + string.whitespace)).split() - ठीक है, बिंदु ले लिया। यह अब हास्यास्पद है ... - Jamie Bull


if needle in haystack: सामान्य उपयोग है, जैसा कि @ माइकल कहते हैं - यह इस पर निर्भर करता है in ऑपरेटर, एक विधि कॉल से अधिक पठनीय और तेज।

यदि आपको वास्तव में ऑपरेटर की बजाय एक विधि की आवश्यकता है (उदा। कुछ अजीब करने के लिए key= एक बहुत ही असाधारण प्रकार के लिए ...?), वह होगा 'haystack'.__contains__। लेकिन चूंकि आपका उदाहरण एक में उपयोग के लिए है if, मुझे लगता है कि आप वास्तव में इसका मतलब नहीं है कि आप क्या कहते हैं ;-)। यह विशेष रूप से विशेष तरीकों का उपयोग करने के लिए अच्छा फॉर्म नहीं है (न ही पठनीय, और न ही कुशल) - इसका उपयोग उन ऑपरेटरों और बिल्टिन के माध्यम से किया जाता है, जो उनके लिए प्रतिनिधि हैं।


125
2017-08-09 03:19





असल में, आप अजगर में एक स्ट्रिंग में एक सबस्ट्रिंग खोजना चाहते हैं। पायथन में स्ट्रिंग में एक सबस्ट्रिंग की खोज करने के दो तरीके हैं।

विधि 1: in ऑपरेटर

आप पाइथन का उपयोग कर सकते हैं in एक सबस्ट्रिंग की जांच करने के लिए ऑपरेटर। यह काफी सरल और सहज है। यह वापस आ जाएगा True अगर स्ट्रिंग स्ट्रिंग में पाया गया था False

>>> "King" in "King's landing"
True

>>> "Jon Snow" in "King's landing"
False

विधि 2: str.find() तरीका

दूसरी विधि का उपयोग करना है str.find() तरीका। यहां, हम कॉल करते हैं .find() स्ट्रिंग पर विधि जिसमें substring पाया जाता है। हम substring को खोजने () विधि में पास करते हैं और इसके वापसी मूल्य की जांच करते हैं। यदि इसका मान -1 से अधिक है, तो स्ट्रिंग स्ट्रिंग में पाया गया था, अन्यथा नहीं। लौटाया गया मूल्य वह सूचकांक है जहां सबस्ट्रिंग पाया गया था।

>>> some_string = "valar morghulis"

>>> some_string.find("morghulis")
6

>>> some_string.find("dohaeris")
-1

मैं आपको पहली विधि का उपयोग करने की सलाह दूंगा क्योंकि यह अधिक पाइथोनिक और सहज है।


98
2018-05-26 17:46





क्या पाइथन में स्ट्रिंग में स्ट्रिंग विधि होती है?

हां, लेकिन पायथन में एक तुलना ऑपरेटर है जिसका आपको उपयोग करना चाहिए, क्योंकि भाषा इसका उपयोग करने का इरादा रखती है, और अन्य प्रोग्रामर आपको इसका उपयोग करने की उम्मीद करेंगे। वह कीवर्ड है in, जो एक तुलना ऑपरेटर के रूप में प्रयोग किया जाता है:

>>> 'foo' in '**foo**'
True

विपरीत (पूरक), जो मूल प्रश्न पूछता है, है not in:

>>> 'foo' not in '**foo**' # returns False
False

यह अर्थात् समान है not 'foo' in '**foo**' लेकिन यह पठनीयता सुधार के रूप में भाषा में अधिक पढ़ने योग्य और स्पष्ट रूप से प्रदान किया गया है।

प्रयोग करने से बचें __contains__, find, तथा index

जैसा कि वादा किया गया है, यहां है contains तरीका:

str.__contains__('**foo**', 'foo')

रिटर्न True। आप सुपरस्टिंग के उदाहरण से इस फ़ंक्शन को भी कॉल कर सकते हैं:

'**foo**'.__contains__('foo')

लेकिन मत करो। अंडरस्कोर से शुरू होने वाले तरीके को अर्थात् निजी माना जाता है। इसका उपयोग करने का एकमात्र कारण यह है कि विस्तार करते समय in तथा not in कार्यक्षमता (उदा। अगर subclassing str):

class NoisyString(str):
    def __contains__(self, other):
        print('testing if "{0}" in "{1}"'.format(other, self))
        return super(NoisyString, self).__contains__(other)

ns = NoisyString('a string with a substring inside')

और अब:

>>> 'substring' in ns
testing if "substring" in "a string with a substring inside"
True

साथ ही, निम्न स्ट्रिंग विधियों से बचें:

>>> '**foo**'.index('foo')
2
>>> '**foo**'.find('foo')
2

>>> '**oo**'.find('foo')
-1
>>> '**oo**'.index('foo')

Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    '**oo**'.index('foo')
ValueError: substring not found

अन्य भाषाओं में सबस्ट्रिंग्स के लिए सीधे परीक्षण करने के लिए कोई तरीका नहीं हो सकता है, और इसलिए आपको इन प्रकार के तरीकों का उपयोग करना होगा, लेकिन पायथन के साथ, यह उपयोग करने के लिए और अधिक कुशल है inतुलना ऑपरेटर।

प्रदर्शन तुलना

हम एक ही लक्ष्य को पूरा करने के विभिन्न तरीकों की तुलना कर सकते हैं।

import timeit

def in_(s, other):
    return other in s

def contains(s, other):
    return s.__contains__(other)

def find(s, other):
    return s.find(other) != -1

def index(s, other):
    try:
        s.index(other)
    except ValueError:
        return False
    else:
        return True



perf_dict = {
'in:True': min(timeit.repeat(lambda: in_('superstring', 'str'))),
'in:False': min(timeit.repeat(lambda: in_('superstring', 'not'))),
'__contains__:True': min(timeit.repeat(lambda: contains('superstring', 'str'))),
'__contains__:False': min(timeit.repeat(lambda: contains('superstring', 'not'))),
'find:True': min(timeit.repeat(lambda: find('superstring', 'str'))),
'find:False': min(timeit.repeat(lambda: find('superstring', 'not'))),
'index:True': min(timeit.repeat(lambda: index('superstring', 'str'))),
'index:False': min(timeit.repeat(lambda: index('superstring', 'not'))),
}

और अब हम देखते हैं कि इसका उपयोग कर रहे हैं in दूसरों की तुलना में बहुत तेज है। बराबर ऑपरेशन करने के लिए कम समय बेहतर है:

>>> perf_dict
{'in:True': 0.16450627865128808,
 'in:False': 0.1609668098178645,
 '__contains__:True': 0.24355481654697542,
 '__contains__:False': 0.24382793854783813,
 'find:True': 0.3067379407923454,
 'find:False': 0.29860888058124146,
 'index:True': 0.29647137792585454,
 'index:False': 0.5502287584545229}

90
2017-11-25 22:33



एक से क्यों बचना चाहिए str.index तथा str.find? आप किसी और को यह बताएंगे कि किसी व्यक्ति के बजाय एक सबस्ट्रिंग का इंडेक्स कैसे है या नहीं? (या आप का मतलब है कि उनमें शामिल होने से बचने से बचें - तो इसका उपयोग न करें s.find(ss) != -1 के बजाय ss in s?) - coderforlife
निश्चित रूप से, हालांकि उन तरीकों के उपयोग के पीछे इरादा बेहतर ढंग से उपयोग के द्वारा संबोधित किया जा सकता है re मॉड्यूल। मुझे अभी तक किसी भी कोड में str.index या str.find के लिए उपयोग नहीं मिला है जिसे मैंने अभी लिखा है। - Aaron Hall♦


नहीं, कोई नहीं है string.contains(str) विधि, लेकिन वहाँ है in ऑपरेटर:

if substring in someString:
    print "It's there!!!"

यहां एक जटिल कामकाजी उदाहरण है:

# Print all files with dot in home directory
import commands
(st, output) = commands.getstatusoutput('ls -a ~')
print [f for f in output.split('\n') if '.' in f ]

61
2017-09-30 18:59



पार्सिंग का प्रशंसक नहीं ls, लेकिन मुझे लगता है कि आपने यह उदाहरण क्यों दिया। फिर भी ... बल्कि देखा होगा os.walk। - Josh Detwiler


in पायथन स्ट्रिंग्स और सूचियां

यहां कुछ उपयोगी उदाहरण दिए गए हैं जो खुद के बारे में बात करते हैं in तरीका:

"foo" in "foobar"
True

"foo" in "Foobar"
False

"foo" in "Foobar".lower()
True

"foo".capitalize() in "Foobar"
True

"foo" in ["bar", "foo", "foobar"]
True

"foo" in ["fo", "o", "foobar"]
False

चेतावनी। सूची पुनरावृत्त हैं, और in विधि केवल तारों पर नहीं, पुनरावृत्तियों पर कार्य करता है।


31
2018-04-28 18:52



क्या एक स्ट्रिंग में किसी भी सूची को देखने के लिए सूची को पुन: व्यवस्थित किया जा सकता है? उदाहरण के लिए: ["bar", "foo", "foobar"] in "foof"? - CaffeinatedCoder
@ कैफीनयुक्त कोडर, नहीं, इसके लिए नेस्टेड पुनरावृत्ति की आवश्यकता है। पाइप "|" .join (["bar", "foo", "foobar"]) के साथ सूची में शामिल होने से सबसे अच्छा किया जाता है और इसके बाहर एक रेगेक्स संकलित करता है, फिर "foof" पर मेल खाता है - firelynx
मुझे जल्दी पता चला कि यह जनरेटर के साथ भी किया जा सकता है, जिसने मुझे रेगेक्स से बचने की अनुमति दी। हालांकि एक विकल्प के लिए धन्यवाद! - CaffeinatedCoder
कोई भी [[x में "foof" x में x "[bar", "foo", "foobar"]]) - Izaak Weiss
@IzaakWeiss आपका एक लाइनर काम करता है, लेकिन यह बहुत पठनीय नहीं है, और यह घोंसला घोंसला करता है। मैं ऐसा करने के खिलाफ सलाह दूंगा - firelynx


तो स्पष्ट रूप से वेक्टर-वार तुलना के लिए कुछ भी समान नहीं है। ऐसा करने के लिए एक स्पष्ट पायथन तरीका होगा:

names = ['bob', 'john', 'mike']
any(st in 'bob and john' for st in names) 
>> True

any(st in 'mary and jane' for st in names) 
>> False

21
2017-07-17 13:19



ऐसा इसलिए है क्योंकि परमाणु चर से उत्पाद बनाने का एक अरब तरीका है। आप उन्हें एक टुपल, एक सूची (जो कार्टेशियन उत्पादों के रूप हैं और एक निहित क्रम के साथ आते हैं) में सामान डाल सकते हैं, या उन्हें कक्षा (गुणों का कोई पूर्व आदेश) या शब्दकोश मानों के गुणों का नाम दिया जा सकता है, या वे फाइलें हो सकते हैं एक निर्देशिका, या जो भी हो। जब भी आप 'कंटेनर' या 'संदर्भ' में कुछ विशिष्ट रूप से पहचान सकते हैं (iter या getitem), तो आप उस कंटेनर के रूप में 'कंटेनर' देख सकते हैं और उस पर बाइनरी ऑप्स को परिभाषित कर सकते हैं। en.wikipedia.org/wiki/... - Niriel
@Ufos मुझे लगता है कि ऐसा करने के लिए और अधिक स्पष्ट पायथन तरीका उपयोग करना है any() या all()। पसंद : any([st in 'bob and john' for st in names]) >>> True - mgc
@ एमजीसी, इसे बदल दिया any, धन्यवाद। - Ufos
आपको किसी भी आंतरिक स्क्वायर ब्रैकेट की आवश्यकता नहीं है - python.org/dev/peps/pep-0289 - Eamonn M.R.


यह जानने का एक और तरीका है कि स्ट्रिंग में कुछ वर्ण हैं या नहीं, बूलियन रिटर्न वैल्यू के साथ (यानी। True या 'झूठा):

str1 = "This be a string"
find_this = "tr"
if find_this in str1:
    print find_this, " is been found in ", str1
else:
    print find_this, " is not found in ", str1

17
2017-07-28 12:32



प्रिंट पहले से तारों के बीच रिक्त स्थान जोड़ता है, लेकिन वैसे भी अच्छा उदाहरण है। - Xavier Arias Botargues
दो तारों के खिलाफ खोज करने के लिए कहें find_that = "ng" यह क्यों काम नहीं करता है: if (find_this or find_that) in str1: print "I found find_this or find_that" - yeliabsalohcin