web-dev-qa-db-ja.com

Pythonには文字列 'contains'部分文字列メソッドがありますか?

私はPythonでstring.containsまたはstring.indexofメソッドを探しています。

私はやってみたいです:

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

in演算子 を使用できます。

if "blah" not in somestring: 
    continue
5155
Michael Mrozek

それが単なるサブストリング検索であるならば、あなたはstring.find("substring")を使うことができます。

ただし、findindex、および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と評価されます。これはあなたが望むものかもしれません。

534
eldarerathis

@Michaelが言うように、if needle in haystack:は通常の使い方です - それは in 演算子に依存しており、メソッド呼び出しよりも読みやすくて速いです。

もしあなたが本当に演算子の代わりにメソッドを必要とするなら(例えば非常に独特なソートのために何か変なkey=をするために...?)、それは 'haystack'.__contains__ でしょう。しかし、あなたの例はifで使うためのものなので、私はあなたが本当にあなたが言うことを意味しているのではないと思います;-)。特別なメソッドを直接使用するのは良い方法ではありません(読みやすくも効率的でもありません)。代わりに、それらを委任する演算子と組み込み関数を通して使用することを意図しています。

148
Alex Martelli

基本的には、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で直感的なので、使用することをお勧めします。

137
Rahul Gupta

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}
120
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 ]
70
Bohdan

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メソッドは文字列だけでなくイテラブルにも作用します。

38
firelynx

したがって、どうやらベクトルごとの比較には似たようなものは何もありません。これを行うための明白な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
28
Ufos

文字列が数文字を含むかどうかをブール値で返すかどうかを調べる別の方法(すなわち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
22
Harish Reddy

もしあなたが"blah" in somestringに満足していても、それを関数呼び出しにしたいのなら、おそらくこれを行うことができます。

import operator

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

Pythonのすべての演算子は、 演算子モジュールinを含めて多かれ少なかれ見つかります。

15
Jeffrey04

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!
14
Inconnu

私はすでに答えがあるのを見ます、しかし私も私の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は部分文字列を見つけるための最速の方法です... 

findindexよりわずかに速いです。

12
Fipsi

これがあなたの答えです:

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
12
ytpillai

部分文字列とは何か、そして部分文字列がどこから始まるのかを調べる最も簡単な方法は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

お役に立てれば。

11
ARGeo

別の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
11
Jamie Bull

いくつかの方法があります。

  1. if x in y:
  2. y.count()
  3. 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
7
Brandon Bailey

前述のように、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', ' ', ' ']
1
Muskovets

たくさんの答えがあります。 

しかしcountを使うのも便利です。

例:

strblah = 'I have blah in me'
if strblah.count('blah') > 0:
    print('Yes: substring found')
0
Naidu