I'm mencari string.berisi
atau string.indexof
metode dalam Python.
Yang ingin saya lakukan:
if not somestring.contains("blah"):
continue
Anda dapat menggunakan di
operator:
if "blah" not in somestring:
continue
Jika itu's hanya substring pencarian, anda dapat menggunakan string.menemukan("substring")
.
Anda harus sedikit berhati-hati dengan cari
, index
, dan tahun
meskipun, karena mereka adalah substring pencarian. 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."
Ini akan mencetak Ditemukan 'adalah' dalam string.
Demikian pula, jika "adalah" s:
akan mengevaluasi untuk Benar
. Ini mungkin atau mungkin tidak menjadi apa yang anda inginkan.
jika jarum di tumpukan jerami:
adalah penggunaan normal, seperti @Michael says-itu bergantung pada tahun
operator, lebih mudah dibaca dan lebih cepat daripada metode panggilan.
Jika anda benar-benar membutuhkan suatu metode, bukan operator (misalnya untuk melakukan beberapa aneh key=
sangat aneh semacam...?), yang akan 'jerami'.__berisi__
. Tapi karena anda contoh untuk digunakan dalam sebuah jika
, saya kira anda don't benar-benar berarti apa yang anda katakan;-). It's tidak baik bentuk (atau dibaca, dan tidak efisien) untuk menggunakan metode langsung-mereka're dimaksudkan untuk digunakan, sebaliknya, melalui operator dan builtins yang mendelegasikan kepada mereka.
Tidak Python memiliki string yang berisi substring metode?
Ya, tapi Python memiliki operator perbandingan yang seharusnya anda gunakan bukan, karena bahasa bermaksud penggunaannya, dan programmer lain akan mengharapkan anda untuk menggunakannya. Kata kunci yang dalam
, yang digunakan sebagai operator perbandingan:
>>> 'foo' in '**foo**'
True
Berlawanan (saling melengkapi), yang asli pertanyaannya adalah tidak
:
>>> 'foo' not in '**foo**' # returns False
False
Ini adalah semantik yang sama sebagai tidak 'foo' di '**foo**'
tetapi's jauh lebih mudah dibaca dan secara eksplisit diberikan dalam bahasa yang mudah dibaca perbaikan.
__memuat__
, menemukan
, dan index
Seperti yang dijanjikan, di sini's berisi
metode:
str.__contains__('**foo**', 'foo')
mengembalikan True
. Anda bisa juga memanggil fungsi ini dari contoh superstring:
'**foo**'.__contains__('foo')
Tapi don't. Metode yang dimulai dengan menggarisbawahi dianggap semantik pribadi. Satu-satunya alasan untuk menggunakan ini adalah ketika memperpanjang di
dan tidak
fungsi (misalnya 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, menghindari string berikut metode:
>>> '**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-bahasa lain yang mungkin tidak memiliki metode untuk langsung tes untuk substring, dan sehingga anda akan memiliki untuk menggunakan jenis metode, tetapi dengan Python, hal ini jauh lebih efisien untuk menggunakan di
operator perbandingan.
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 bahwa menggunakan di
jauh lebih cepat dari yang lain.
Kurang waktu untuk melakukan setara operasi yang 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}
di
Python string dan daftarBerikut ini adalah beberapa contoh yang berguna yang berbicara untuk diri mereka sendiri tentang dalam
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 iterables, dan dalam
metode kisah pada iterables, tidak hanya string.
Jadi rupanya tidak ada yang serupa untuk vektor-wise comparison. Yang jelas Python cara untuk melakukannya akan sama:
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
Jika anda senang dengan "bla" di somestring
tapi ingin menjadi fungsi/method, anda mungkin dapat melakukan hal ini
import operator
if not operator.contains(somestring, "blah"):
continue
Semua operator di Python dapat menjadi lebih atau kurang yang ditemukan di operator modul termasuk dalam
.
Anda dapat menggunakan y.count()
.
Ini akan mengembalikan nilai integer dari jumlah sub string muncul dalam sebuah string.
Misalnya:
string.count("bah") >> 0
string.count("Hello") >> 1
Di sini adalah jawaban anda:
if "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
Untuk memeriksa apakah itu adalah palsu:
if not "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
ATAU:
if "insert_char_or_string_here" not in "insert_string_to_search_here":
#DOSTUFF
Anda dapat menggunakan ekspresi reguler untuk mendapatkan kejadian:
>>> import re
>>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space
['t', ' ', 't', ' ', ' ']