私はPythonでstring.contains
またはstring.indexof
メソッドを探しています。
私はやってみたいです:
if not somestring.contains("blah"):
continue
in
演算子 を使用できます。
if "blah" not in somestring:
continue
それが単なるサブストリング検索であるならば、あなたは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
と評価されます。これはあなたが望むものかもしれません。
@Michaelが言うように、if needle in haystack:
は通常の使い方です - それは in
演算子に依存しており、メソッド呼び出しよりも読みやすくて速いです。
もしあなたが本当に演算子の代わりにメソッドを必要とするなら(例えば非常に独特なソートのために何か変なkey=
をするために...?)、それは 'haystack'.__contains__
でしょう。しかし、あなたの例はif
で使うためのものなので、私はあなたが本当にあなたが言うことを意味しているのではないと思います;-)。特別なメソッドを直接使用するのは良い方法ではありません(読みやすくも効率的でもありません)。代わりに、それらを委任する演算子と組み込み関数を通して使用することを意図しています。
基本的には、Pythonでは文字列の中から部分文字列を見つけたいのです。 Pythonで文字列内の部分文字列を検索する方法は2つあります。
方法1:in
演算子
Pythonのin
演算子を使って部分文字列をチェックすることができます。とてもシンプルで直感的です。部分文字列が文字列で見つかった場合はTrue
を返し、それ以外の場合はFalse
を返します。
>>> "King" in "King's landing"
True
>>> "Jon Snow" in "King's landing"
False
方法2:str.find()
メソッド
2番目の方法はstr.find()
メソッドを使うことです。ここでは、substringが見つかる文字列に対して.find()
メソッドを呼び出します。サブストリングをfind()メソッドに渡して、その戻り値を確認します。値が-1以外の場合、部分文字列は文字列内に見つかりました。それ以外の場合は見つかりません。返される値は部分文字列が見つかった場所のインデックスです。
>>> some_string = "valar morghulis"
>>> some_string.find("morghulis")
6
>>> some_string.find("dohaeris")
-1
最初の方法はPythonicで直感的なので、使用することをお勧めします。
Pythonは部分文字列メソッドを含む文字列を持っていますか?
はい、しかしPythonにはあなたが代わりに使うべき比較演算子があります、それはその言語がその使い方を意図しているからです、そして他のプログラマーはあなたがそれを使うことを期待するでしょう。そのキーワードは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
機能を拡張するときです(たとえば、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
他の言語では部分文字列を直接テストする方法がない場合もあるので、これらの種類の方法を使用する必要がありますが、Pythonでは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}
いいえ、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 ]
in
Pythonの文字列とリスト以下は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
メソッドは文字列だけでなくイテラブルにも作用します。
したがって、どうやらベクトルごとの比較には似たようなものは何もありません。これを行うための明白なPythonの方法は次のようになります。
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
文字列が数文字を含むかどうかをブール値で返すかどうかを調べる別の方法(すなわちTrue
または `False):
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
もしあなたが"blah" in somestring
に満足していても、それを関数呼び出しにしたいのなら、おそらくこれを行うことができます。
import operator
if not operator.contains(somestring, "blah"):
continue
Pythonのすべての演算子は、 演算子モジュールin
を含めて多かれ少なかれ見つかります。
Pythonでは、これを実現するための簡単な方法が2つあります。
Pythonicの方法:Pythonの 'in'キーワードの使用 -
in
は、左側に1つ( substring )、右側に1つの2つの "arguments"を取り、左側の引数が右側の引数に含まれる場合はTrue
を返し、含まない場合はFalse
を返します。
example_string = "This is an example string"
substring = "example"
print(substring in example_string)
出力:
True
非Pythonicな方法:Pythonのstr.findを使う:
find
メソッドは、文字列内の文字列の位置を返します。見つからない場合は-1を返します。しかし、単に位置が-1ではないかどうかを確認してください。
if example_string.find(substring) != -1:
print('Substring found!')
else:
print('Substring not found!')
出力:
Substring found!
私はすでに答えがあるのを見ます、しかし私も私の2セントを加えたいです。
Pythonにはこれを行うための関数がありますが、最も簡単な(そして最も推奨される)方法は、キーワードin
を使用することです。
"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
いくつかの文字列メソッドもあります。
"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...
公演について
一般にin
は部分文字列を見つけるための最速の方法です...
find
はindex
よりわずかに速いです。
これがあなたの答えです:
if "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
それが偽かどうかをチェックするために:
if not "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
または:
if "insert_char_or_string_here" not in "insert_string_to_search_here":
#DOSTUFF
部分文字列とは何か、そして部分文字列がどこから始まるのかを調べる最も簡単な方法は4つあります。
最初のものはPythonの
in
演算子によるものです。
someString = "Polly is drinking Coca-Cola."
"Coca-Cola" in someString
# Result: True
"Pepsi" in someString
# Result: False
2番目の方法は、文字列の
find()
メソッドを使用することです。
ブール値 に評価されるin
演算子とは異なり、find
メソッドは integer を返します。このサブストリングが存在する場合、この整数はサブストリングの先頭のインデックスです。それ以外の場合、-1
が返されます。これがどのように動作するのかです:
someString = "Polly is drinking Coca-Cola."
someString.find("is")
# Result: 6
someString.find("Pepsi")
# Result: -1
someString.find("Polly")
# Result: 0
開始インデックスと終了インデックスを指定して検索を制限することもできます。例えば:
someString = "Polly is drinking Coca-Cola."
someString.find("is", 5, 10)
# Result: 6
someString.find("Polly", 15, 20)
# Result: -1
三番。そして、もちろん、
if...is not
ステートメントを使うことができます(これはPython 2.7と3.6で動きます):
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!"
四。
index()
メソッドを使用してください。それはfind()
メソッドとほとんど同じです。
someString = "Polly is drinking Coca-Cola."
x = someString.index("drinking")
print(x)
# Result: 9
お役に立てれば。
別のWordに含まれる部分文字列ではなく、大文字と小文字を区別しないで単語全体を検索する場合
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
いくつかの方法があります。
if x in y:
y.count()
y.find()
1はブール式です。つまり、条件が満たされるかどうかに応じて、TrueまたはFalse のいずれかの状態を返します。
例えば:
string = "Hello world"
if "Hello" in string: >>True
if "Python" in string: >>False
2は、サブストリングがストリングに現れる回数の整数値を戻します。
例えば:
string.count("bah") >> 0
string.count("Hello") >> 1
3は与えられた部分文字列の初期位置のインデックス値を返します。サブストリングが見つからない場合も、これは-1を戻します。
例えば:
string.find("Hello") >>0
string.find("foo") >>-1
前述のように、in
演算子を次のように使用できます。
>>> 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
また、出現を取得するために正規表現を使うことができます。
>>> import re
>>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space
['t', ' ', 't', ' ', ' ']
たくさんの答えがあります。
しかしcount
を使うのも便利です。
例:
strblah = 'I have blah in me'
if strblah.count('blah') > 0:
print('Yes: substring found')