Python "substring" metoduna malikdirmi?

string.indexof string.contains və ya string.indexof .

Etmək istəyirəm:

 if not somestring.contains("blah"): continue 
3322
09 авг. Blankman tərəfindən 09 avqust . 2010-08-09 05:52 '10 at 5:52 am 2010-08-09 05:52
@ 18 cavab

Operatordan istifadə edə bilərsiniz:

 if "blah" not in somestring: continue 
4988
09 авг. Michael Mrozek tərəfindən verilmiş cavab 09 Avqust. 2010-08-09 05:56 '10 'da 5:56' da 2010-08-09 05:56

Bu yalnız bir substring axtarışıdırsa, string.find("substring") istifadə edə bilərsiniz.

Bir substrinqlə icra edilməsinə baxmayaraq, find , index və bir az ehtiyatlı olmaq lazımdır. Başqa sözlə, bu:

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

Sətirdə Found 'is' in the string. Eləcə də, if "is" in s: sözsüzlüyə düşərsə if "is" in s: True qiymətləndirəcəkdir. İstədiyiniz və ya olmaya bilər.

524
09 авг. cavab eldarerathis 09 aug tərəfindən verilir . 2010-08-09 05:55 '10 at 5:55 2010-08-09 05:55

if needle in haystack: - bu normal istifadədir, @ Michael deyir - bu in operatoru daha çox oxunaqlı və metodu çağırmaqdan daha sürətli dayanır.

Bir operatora əvəzinə bir metana ehtiyac duyarsanız (məsələn, bəzi qəribə bir key= çox xüsusi bir növü üçün ...), 'haystack'.__contains__ . Ancaq nümunən istifadə üçün nəzərdə tutulduğu üçün, məncə, siz nə demək istədiyinizi anlamırsınız ;-). Bu, xüsusi üsulları birbaşa istifadə etmək üçün yaxşı bir forma deyildir (nə oxunan, nə də səmərəli) - onlar operatorlar və istifadəçilərə təyin edilmiş funksiyalar yerinə yetirilməlidir.

143
09 авг. Cavab 09 Mart tarixində Alex Martelli tərəfindən verildi . 2010-08-09 06:19 '10 at 6:19 AM 2010-08-09 06:19

Əsasən, Python-da simli bir substrinq tapmaq istəyirik. Python-da simli bir substrinq axtarmağın iki yolu var.

Metod 1: operatorda

Substrinin sınanması üçün operatorda Python istifadə edə bilərsiniz. Çox sadə və intuitivdir. Substrinin simli tapdıqda, əksinə False olduğu təqdirdə True qayıdır.

 >>> "King" in "King landing" True >>> "Jon Snow" in "King landing" False 

Metod 2: str.find() metodu

İkinci üsul str.find() istifadə str.find() . Burada substrinin tapılacağı string üçün .find() metodu deyirik. Substrinqi find () metoduna keçiririk və onun qaytarılması dəyərini yoxlayırıq. Onun dəyəri -1 -dən fərqli olarsa, alt dizgə simli halda, əks halda deyil. Dönüş dəyəri substrinin tapıldığı indeksdir.

 >>> some_string = "valar morghulis" >>> some_string.find("morghulis") 6 >>> some_string.find("dohaeris") -1 

Daha çox Pythonic və intuitiv olduğundan, ilk metoddan istifadə etməyi tövsiyə edirəm.

130
26 мая '15 в 20:46 2015-05-26 20:46 Cavab, Rahul Gupta tərəfindən 26 May '15 'də saat 20:46' də veriləcək 2015-05-26 20:46

Pythonda substrinq üsulu olan bir simli varmı?

Bəli, Python bir müqayisə operatoruna malikdir və onu istifadə etmək niyyətindədir, çünki digər proqramçılar sizdən istifadə etməyi gözləyir. Bu, bir müqayisə operatoru olaraq istifadə olunan sözdədir:

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

Orijinal sualın soruşduğu əks (əlavə):

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

Bu semantik olaraq not 'foo' in '**foo**' kimi not 'foo' in '**foo**' , eyni zamanda oxunaqlılığın inkişafı kimi daha çox oxunaqlı və açıq şəkildə təqdim edilir.

__contains__ istifadə edərək, findindex çəkinin

Söz verildiyi kimi, burada üsuldur:

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

True qaytarır. Ayrıca, bu funksiyanı süper bir örnekten çağırabilirsiniz:

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

Amma etmə. Alt çizgi ilə başlayan üsullar semantik olaraq qəbul edilir. Bunun üçün yeganə səbəb funksiyaları not in (məsələn, subclassing str ) genişləndirməkdir:

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

və indi:

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

Aşağıdakı simli üsullardan da çəkin:

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

Digər dillərdə birbaşa substrinqləri sınamaq üçün üsullar yoxdur, belə ki, bu cür üsullardan istifadə etmək lazımdır, lakin Python ilə müqayisədə operatoru istifadə etmək daha səmərəli olur.

Performans müqayisə

Eyni hədəfə çatmağın müxtəlif yollarını müqayisə edə bilərik.

 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'))), } 

İndi istifadə etdiyimiz digərindən daha sürətli olduğunu görürük. Müvafiq əməliyyat yerinə yetirmək üçün daha az vaxt daha yaxşıdır:

 >>> 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} 
115
26 нояб. Cavab 26 noyabrda Aaron Hall tərəfindən verilir. 2014-11-26 01:33 '14 da 1:33 2014-11-26 01:33

Xeyr, string.contains(str) metodu yoxdur, lakin bir operator var:

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

İşdə daha kompleks bir nümunə:

 # 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 ] 
68
30 сент. Cavab Bohdan tərəfindən sentyabr 30 verilir 2013-09-30 21:59 '13 saat 09:59 'da 2013-09-30 21:59

Python strings və siyahıları

Burada üsulla özləri danışan bəzi faydalı nümunələr:

 "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 

Caveat Siyahıları yinelenebilir və üsul təkrarlanma deyil, yineleme ilə bağlıdır.

36
28 апр. Reply firelynx 28 apr. 2017-04-28 21:52 '17 at 9:52 pm 2017-04-28 21:52

Beləliklə, bir vektor müqayisəsi üçün belə bir şey olmadığı görünür. Bunu Python üçün açıq şəkildə göstərmək olar:

 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 
26
17 июля '15 в 16:19 2015-07-17 16:19 Cavab Ufos 17 iyul '15 'də 16:19' da verilir 2015-07-17 16:19

Bir simli Booleanın (yəni, True və ya False) qaynaq dəyəri ilə bir neçə simvolu və ya olmadığını tapmaq üçün başqa bir yol:

 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 
20
28 июля '11 в 15:32 2011-07-28 15:32 Cavab Harish Reddy tərəfindən 28 İyul, '11 'də 15:32' də verildi 2011-07-28 15:32

Əgər siz "blah" in somestring bir funksiya çağrısı olmasını istəyirsənsə, bunu edə bilərsiniz

 import operator if not operator.contains(somestring, "blah"): continue 

Python'daki bütün operatorlar, daxil olmaqla , operator modulunda az və ya çox ola bilər.

13
28 марта '18 в 12:59 2018-03-28 12:59 Cavab, Jeffrey04 tərəfindən 28 Mart 18 saat 12:59 'də 2018-03-28 12:59 tarixində verilir

Bunu Python'da etmək üçün iki asan yol var:

Pythonic Path: Python istifadə 'sözü'

solda (substrinqdə) və sağ tərəfdə iki "arqument" götürülür və sol arqument hüquqlar arqumentindədirsə və doğru deyilsə, doğru False .

 example_string = "This is an example string" substring = "example" print(substring in example_string) 

Nəticə:

 True 

Qeyri-pitonik metod: Python str.find istifadə:

Tapşırıq metodu simli bir simli mövqeyini qaytarır və ya tapılmadıqda -1 olur. Lakin mövqeyi -1 olub olmadığını yoxlayın.

 if example_string.find(substring) != -1: print('Substring found!') else: print('Substring not found!') 

Nəticə:

 Substring found! 
12
20 нояб. Cavab İnconnu tərəfindən 20 noyabrda verilir 2016-11-20 21:58 '16 at 21:58 2016-11-20 21:58

Cavabınız:

 if "insert_char_or_string_here" in "insert_string_to_search_here": #DOSTUFF 

Yanlış olub olmadığını yoxlamaq üçün:

 if not "insert_char_or_string_here" in "insert_string_to_search_here": #DOSTUFF 

Yoxsa:

 if "insert_char_or_string_here" not in "insert_string_to_search_here": #DOSTUFF 
11
26 мая '15 в 1:50 2015-05-26 01:50 Cavab ytpillai tərəfindən verilir 26, '15 at 1:50 am 2015-05-26 01:50

Görürəm ki, artıq cavablar var, amma mən də iki sentimi əlavə etmək istəyirəm.

Bunun üçün Python funksiyaları var, lakin ən sadə (və ən çox üstünlüklü) metod sözündən istifadə etməkdir:

 "test" in "testtext" True "abc" in "abcdefg" True "abc" in "Abc" False "ABC" in "abc" False "abc" in "def" False "abc" in ["abc", "def", "ghi"] True 

Bir neçə simli üsul da var:

 "xxabcxx".find("abc") 2 # Returns the index of the first match "xxabcxx".find("cde") -1 # Returns -1 if the substring # could not be found in the string # And: "xxabcxx".index("abc") 2 "xxabcxx".index("cde") ValueError: substring not found #raises ValueError... 

Performans haqqında:

Ümumiyyətlə, bir substrinq tapmaq ən sürətli yoldur.

find index find qədər daha sürətli.

10
16 июня '18 в 15:02 2018-06-16 15:02 Cavab Fipsi tərəfindən 16 iyun '18' da 15:02 2018-06-16 15:02 'də verilir

Bir başqa sözlə bir alt dildən çox sözlər üçün qeyri-qənaətbəxş bir axtarış axtarırsınızsa:

 import string s = 'This is my text example' if 'is' not in (word.lower() for split_char in string.punctuation + string.whitespace for word in s.split(split_char)): # do something 
10
13 янв. Cavab Jamie Bull tərəfindən Jan 13 2018-01-13 18:32 '18 saat 18:32 'da 2018-01-13 18:32

Substrinin nə olduğunu və substrinqin harada başlandığını öyrənmək üçün dörd asan yol var.

Birincisi Python vasitəsilə operator:

 someString = "Polly is drinking Coca-Cola." "Coca-Cola" in someString # Result: True "Pepsi" in someString # Result: False 

İkinci yol, string find() üçün find() metodundan istifadə etməkdir.

Mantıksal dəyər kimi qiymətləndirilir olan operatordan fərqli olaraq, tapıntı metodu bir tamsayı verir . Bu tamsayı, substrinqin başlanğıcının indeksidir, əgər bu substrinq var, əks halda -1 . İşdə necə:

 someString = "Polly is drinking Coca-Cola." someString.find("is") # Result: 6 someString.find("Pepsi") # Result: -1 someString.find("Polly") # Result: 0 

Axtarışa məhdudlaşdırmaq üçün başlanğıc və bitən göstəriciləri də göstərə bilərsiniz. Məsələn:

 someString = "Polly is drinking Coca-Cola." someString.find("is", 5, 10) # Result: 6 someString.find("Polly", 15, 20) # Result: -1 

Üçüncüsü. Və əlbəttə, if...is not istifadə edə bilərsiniz if...is not deyiş if...is not (Python 2.7 və 3.6'da işləyir):

 someString = "Polly is drinking Coca-Cola." substring = "drinking" if someString.find(substring) is not -1: print("Cool! Python found the desired substring!") else: print("Python didn't find the desired substring!") # Result: "Cool! Python found the desired substring!" 

Dördüncü. index() metodundan istifadə edin. Bu, find() metodu ilə demək olar ki, eynidır.

 someString = "Polly is drinking Coca-Cola." x = someString.index("drinking") print(x) # Result: 9 

Bu kömək edir.

4
25 дек. ARGeo tərəfindən verilən cavab 25 dekabr. 2018-12-25 18:35 '18 'də saat 18:35' da 2018-12-25 18:35

Artıq qeyd edildiyi kimi in operatoru aşağıdakı kimi istifadə edə bilərsiniz:

 >>> to_search_in = "String to search in" >>> to_search = "search" >>> print(to_search in to_search_in) True >>> print(to_search_in.find(to_search)) 10 

Girişləri almaq üçün normal ifadələrdən istifadə edə bilərsiniz:

 >>> import re >>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space ['t', ' ', 't', ' ', ' '] 
1
23 нояб. Cavab Muskovets 23 noyabrda verilir. 2018-11-23 10:15 '18 saat 10:15 'da 2018-11-23 10:15

Çox cavab var.

Amma istifadə count rahat ola bilər.

Məsələn:

 strblah = 'I have blah in me' if strblah.count('blah') > 0: print('Yes: substring found') 
0
23 янв. Cavab 23 yanvar tarixində Naidu tərəfindən verilir . 2019-01-23 22:58 '19 saat 10:58 'da 2019-01-23 22:58

Dəyişən zolaqları hesablamaq

 a = "Hello, what your name?" if a.count("what's"): print("Found") else: print("Not found") 
0
02 дек. Cavab RAMunna 02 Dek 2017-12-02 23:12 '17 'da 11:12' də 2017-12-02 23:12 'də

tags haqqında digər suallar və ya bir sual