複数 - python 文字列部分一致




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

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

私はやってみたいです:

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

Pythonには文字列に部分文字列メソッドが含まれていますか?

Pythonには比較演算子があります。なぜなら、言語がその使用を意図しているからで、他のプログラマーはあなたがそれを使うと期待しているからです。 そのキーワードは比較演算子として使用されます。

>>> '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返しTrue 。 また、スーパーストリングのインスタンスからこの関数を呼び出すこともできます。

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

しかし、しないでください。 アンダースコアで始まるメソッドは、意味的にプライベートと見なされます。 これを使用する唯一の理由not in機能を拡張inたり、拡張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}

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

警告。 リストはiterableであり、 inメソッドは文字列だけでなくiterablesに対しても動作します。


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

オペレータの代わりに本当にメソッドが必要な場合(例えば、奇妙なkey=非常に特殊なソートを行う場合など)、それは'haystack'.__contains__ 。 しかし、あなたの例はifで使用するためのものなので、あなたが言うことを本当に意味するわけではありません;-)。 特別なメソッドを直接使用するのは良い形式ではなく(読み込み不可能でも効率的でもありません)、代わりに代理演算子や組み込み関数を使用することを前提としています。


in演算子を使用することができます:

if "blah" not in somestring: 
    continue

あなたの答えはここにあります:

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

OR:

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

いいえ、 string.contains(str)メソッドはありませんが、 in演算子がありstring.contains(str)

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 ]

別の単語に含まれる部分文字列ではなく、単語全体を大文字と小文字を区別しない検索で検索する場合は、次のようにします。

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

基本的には、Pythonで文字列内の部分文字列を探したいとします。 Pythonで文字列の部分文字列を検索する方法は2つあります。

方法1:オペレータで

Pythonのin演算子を使用して、部分文字列をチェックすることができます。 それは非常に簡単で直感的です。 部分文字列が文字列else False見つかった場合はTrueを返しTrue

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

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

方法2: str.find()メソッド

2番目の方法は、 str.find()メソッドを使用することです。 ここでは、部分文字列が見つかる文字列に対して.find()メソッドを呼び出します。 部分文字列をfind()メソッドに渡し、戻り値をチェックします。 その値が-1以外の場合は、文字列に部分文字列が見つかりました。 返される値は、部分文字列が見つかったインデックスです。

>>> some_string = "valar morghulis"

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

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

私はそれがよりPythonと直感的なので、最初の方法を使用することをお勧めします。


私は既に答えがあるのを見ますが、私は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よりわずかに速い

私は助けることができますように!


部分文字列検索の場合は、 string.find("substring")使用できます。

あなたはfindindex 、そしてsubstring searchであるので少し注意する必要があります。 言い換えれば、これは:

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と評価されTrue 。 これはあなたが望むものかもしれません。





contains