Frage Hat Python eine Zeichenkette 'contains' substring method?


Ich suche ein string.contains oder string.indexof Methode in Python.

Ich will das tun:

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

2871
2017-08-09 02:52


Ursprung


Antworten:


Du kannst den ... benutzen in Operator:

if "blah" not in somestring: 
    continue

4348
2017-08-09 02:56



Wenn es nur eine Teilzeichensuche ist, die Sie verwenden können string.find("substring").

Du musst ein bisschen vorsichtig mit sein find, index, und in obwohl sie Teilstringsuchen sind. Mit anderen Worten:

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

Es würde drucken Found 'is' in the string. Ähnlich, if "is" in s: würde bewerten zu True. Dies kann oder kann nicht sein, was Sie wollen.


458
2017-08-09 02:55



if needle in haystack: ist der normale Gebrauch, wie @ Michael sagt - es beruht auf dem in Operator, lesbarer und schneller als ein Methodenaufruf.

Wenn Sie wirklich eine Methode anstelle eines Operators benötigen (z. B. etwas seltsames zu tun) key= für eine sehr eigenartige Art ...?), das wäre 'haystack'.__contains__. Aber da dein Beispiel in einem verwendet wird ifIch glaube du meinst nicht wirklich was du sagst ;-). Es ist keine gute Form (weder lesbar noch effizient), spezielle Methoden direkt zu verwenden - sie sollen vielmehr über die Operatoren und Built-ins verwendet werden, die an sie delegieren.


123
2017-08-09 03:19



Grundsätzlich möchten Sie eine Teilzeichenfolge in einer Zeichenfolge in Python finden. Es gibt zwei Möglichkeiten, in Python nach einer Teilzeichenfolge in einer Zeichenfolge zu suchen.

Methode 1: in Operator

Sie können die Pythons verwenden in Operator, um nach einem Teilstring zu suchen. Es ist ziemlich einfach und intuitiv. Es wird zurückkehren True wenn der Teilstring in der Zeichenfolge else gefunden wurde False.

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

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

Methode 2: str.find() Methode

Die zweite Methode ist die Verwendung der str.find() Methode. Hier rufen wir die .find() Methode für die Zeichenfolge, in der die Teilzeichenfolge gefunden werden soll. Wir übergeben die Teilzeichenfolge an die Methode find () und überprüfen ihren Rückgabewert. Wenn der Wert nicht -1 ist, wurde die Teilzeichenfolge in der Zeichenfolge gefunden, andernfalls nicht. Der zurückgegebene Wert ist der Index, in dem die Teilzeichenfolge gefunden wurde.

>>> some_string = "valar morghulis"

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

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

Ich würde dir empfehlen, die erste Methode zu verwenden, da es pythonischer und intuitiver ist.


98
2018-05-26 17:46



Hat Python eine Zeichenfolge enthält Teilstring-Methode?

Ja, aber Python hat einen Vergleichsoperator, den Sie stattdessen verwenden sollten, da die Sprache ihre Verwendung beabsichtigt und andere Programmierer erwarten, dass Sie sie verwenden. Dieses Schlüsselwort ist in, die als Vergleichsoperator verwendet wird:

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

Das Gegenteil (Komplement), das die ursprüngliche Frage verlangt, ist not in:

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

Das ist semantisch das Gleiche wie not 'foo' in '**foo**' aber es ist viel lesbarer und in der Sprache explizit als Lesbarkeitsverbesserung vorgesehen.

Vermeide das Benutzen __contains__, find, und index

Wie versprochen, hier ist der contains Methode:

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

kehrt zurück True. Sie können diese Funktion auch von der Instanz des Superstrings aus aufrufen:

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

Aber nicht. Methoden, die mit Unterstrichen beginnen, werden als semantisch privat betrachtet. Der einzige Grund, dies zu verwenden, ist, wenn der in und not in Funktionalität (z. B. wenn Unterklassen 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')

und nun:

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

Vermeiden Sie auch die folgenden Zeichenfolgenmethoden:

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

Andere Sprachen haben möglicherweise keine Methoden, um direkt nach Teilstrings zu testen, und Sie müssten diese Arten von Methoden verwenden, aber mit Python ist es viel effizienter, das zu verwenden inVergleichsoperator.

Leistungsvergleiche

Wir können verschiedene Wege vergleichen, um dasselbe Ziel zu erreichen.

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

Und jetzt sehen wir das verwenden in ist viel schneller als die anderen. Weniger Zeit für eine gleichwertige Operation ist besser:

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



Nein, es gibt keine string.contains(str) Methode, aber es gibt die in Operator:

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

Hier ist ein komplexeres Arbeitsbeispiel:

# 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 Python-Strings und Listen

Hier sind ein paar nützliche Beispiele, die für sich sprechen in Methode:

"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

Vorbehalt. Listen sind iterierbar, und die in Methode wirkt auf Iterables, nicht nur auf Strings.


31
2018-04-28 18:52



Für einen vektoriellen Vergleich scheint es also nichts Ähnliches zu geben. Ein naheliegender Python-Weg wäre:

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

21
2017-07-17 13:19