Pertanyaan Apakah Python memiliki string 'berisi' metode substring?


Saya mencari a string.contains atau string.indexof metode dengan Python.

Aku ingin melakukan:

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

2871
2017-08-09 02:52


asal


Jawaban:


Anda dapat menggunakan in operator:

if "blah" not in somestring: 
    continue

4348
2017-08-09 02:56



Jika itu hanya pencarian substring yang dapat Anda gunakan string.find("substring").

Anda harus sedikit berhati-hati find, index, dan in meskipun, karena mereka adalah pencarian substring. Dengan kata lain, ini:

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

Itu akan dicetak Found 'is' in the string. Demikian pula, if "is" in s: akan mengevaluasi ke True. Ini mungkin atau mungkin bukan yang Anda inginkan.


458
2017-08-09 02:55



if needle in haystack: adalah penggunaan normal, seperti yang dikatakan @Michael - itu bergantung pada in operator, lebih mudah dibaca dan lebih cepat daripada panggilan metode.

Jika Anda benar-benar membutuhkan metode dan bukan operator (mis. Untuk melakukan sesuatu yang aneh key= untuk semacam yang sangat aneh ...?), itu akan menjadi 'haystack'.__contains__. Tetapi karena contoh Anda adalah untuk digunakan dalam if, Saya kira Anda tidak benar-benar berarti apa yang Anda katakan ;-). Ini bukan bentuk yang baik (tidak dapat dibaca, atau efisien) untuk menggunakan metode khusus secara langsung - mereka dimaksudkan untuk digunakan, sebagai gantinya, melalui operator dan builtins yang mendelegasikan kepada mereka.


123
2017-08-09 03:19



Pada dasarnya, Anda ingin mencari substring dalam string dengan python. Ada dua cara untuk mencari substring dalam string dengan Python.

Metode 1: in operator

Anda dapat menggunakan Python in operator untuk memeriksa substring. Ini cukup sederhana dan intuitif. Itu akan kembali True jika substring ditemukan dalam string yang lain False.

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

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

Metode 2: str.find() metode

Metode kedua adalah menggunakan str.find() metode. Di sini, kami menyebutnya .find() metode pada string di mana substring harus ditemukan. Kami meneruskan substring ke metode find () dan memeriksa nilai kembalinya. Jika nilainya selain -1, substring ditemukan dalam string, sebaliknya tidak. Nilai yang dikembalikan adalah indeks tempat substring ditemukan.

>>> some_string = "valar morghulis"

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

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

Saya akan merekomendasikan Anda untuk menggunakan metode pertama karena lebih Pythonic dan intuitif.


98
2018-05-26 17:46



Apakah Python memiliki string yang berisi metode substring?

Ya, tetapi Python memiliki operator perbandingan yang sebaiknya Anda gunakan sebagai gantinya, karena bahasa itu bermaksud penggunaannya, dan programmer lain akan mengharapkan Anda untuk menggunakannya. Kata kunci itu in, yang digunakan sebagai operator pembanding:

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

Kebalikannya (pelengkap), yang diminta oleh pertanyaan asli, adalah not in:

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

Ini semantis sama dengan not 'foo' in '**foo**' tetapi jauh lebih mudah dibaca dan secara eksplisit disediakan dalam bahasa sebagai peningkatan keterbacaan.

Hindari pemakaian __contains__, find, dan index

Seperti yang dijanjikan, inilah yang contains metode:

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

kembali True. Anda juga bisa memanggil fungsi ini dari contoh superstring:

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

Tetapi tidak. Metode yang dimulai dengan garis bawah dianggap semantik pribadi. Satu-satunya alasan untuk menggunakan ini adalah ketika memperpanjang in dan not in fungsi (mis. jika 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')

dan sekarang:

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

Juga, hindari metode string berikut:

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

Bahasa lain mungkin tidak memiliki metode untuk langsung menguji untuk substring, sehingga Anda harus menggunakan jenis metode ini, tetapi dengan Python, jauh lebih efisien untuk menggunakan inoperator perbandingan.

Perbandingan kinerja

Kita dapat membandingkan berbagai cara untuk mencapai tujuan yang sama.

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

Dan sekarang kita melihat penggunaan itu in jauh lebih cepat daripada yang lain. Lebih sedikit waktu untuk melakukan operasi yang setara lebih baik:

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

89
2017-11-25 22:33



Tidak, tidak ada string.contains(str) metode, tetapi ada in operator:

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

Berikut ini adalah contoh kerja yang lebih kompleks:

# 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



in String dan daftar Python

Berikut adalah beberapa contoh yang bermanfaat yang berbicara untuk diri mereka sendiri tentang in metode:

"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

Peringatan. Daftar adalah iterables, dan in metode bertindak pada iterables, bukan hanya string.


31
2018-04-28 18:52