Vraag Heeft Python een string 'bevat' substringmethode?


ik zoek een string.contains of string.indexof methode in Python.

Ik wil doen:

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

2871
2017-08-09 02:52


oorsprong


antwoorden:


U kunt de in operator:

if "blah" not in somestring: 
    continue

4348
2017-08-09 02:56



Als het om een ​​substring-zoekopdracht gaat die u kunt gebruiken string.find("substring").

Je moet wel een beetje voorzichtig zijn met find, index, en in hoewel ze zoekopdrachten doorzoeken. Met andere woorden, dit:

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

Het zou afdrukken Found 'is' in the string. Evenzo if "is" in s: zou evalueren naar True. Dit kan wel of niet zijn wat je wilt.


458
2017-08-09 02:55



if needle in haystack: is het normale gebruik, zoals @Michael zegt - het vertrouwt op de in operator, leesbaarder en sneller dan een methodeaanroep.

Als je echt een methode nodig hebt in plaats van een operator (bijvoorbeeld om wat raar te doen key= voor een heel bijzonder soort ...?), dat zou zo zijn 'haystack'.__contains__. Maar aangezien uw voorbeeld bedoeld is voor gebruik in een if, Ik denk dat je niet echt meent wat je zegt ;-). Het is geen goede vorm (noch leesbaar, noch efficiënt) om speciale methoden rechtstreeks te gebruiken - ze zijn bedoeld om te worden gebruikt, in plaats daarvan, via de operatoren en ingebouwde functies die aan hen worden gedelegeerd.


123
2017-08-09 03:19



Kortom, je wilt een substring vinden in een string in python. Er zijn twee manieren om te zoeken naar een subtekenreeks in een tekenreeks in Python.

Methode 1: in operator

Je kunt de Python's gebruiken in operator om te controleren op een subtekenreeks. Het is vrij eenvoudig en intuïtief. Het zal terugkeren True als de substring werd gevonden in de reeks anders False.

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

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

Methode 2: str.find() methode

De tweede methode is om de str.find() methode. Hier noemen we de .find() methode op de string waarin substring moet worden gevonden. We geven de subtekenreeks door aan de methode find () en controleren de retourwaarde. Als de waarde anders is dan -1, is de subtekenreeks gevonden in de tekenreeks, anders niet. De geretourneerde waarde is de index waar substring werd gevonden.

>>> some_string = "valar morghulis"

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

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

Ik zou je aanraden om de eerste methode te gebruiken omdat het meer Pythisch en intuïtief is.


98
2018-05-26 17:46



Heeft Python een string met substringmethode?

Ja, maar Python heeft een vergelijkingsoperator die u in plaats daarvan moet gebruiken, omdat de taal bedoeld is voor gebruik en andere programmeurs zullen verwachten dat u het gebruikt. Dat sleutelwoord is in, die wordt gebruikt als vergelijkingsoperator:

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

Het tegenovergestelde (complement), waar de oorspronkelijke vraag om vraagt, is not in:

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

Dit is semantisch hetzelfde als not 'foo' in '**foo**' maar het is veel leesbaarder en expliciet voorzien in de taal als een verbetering van de leesbaarheid.

Vermijd te gebruiken __contains__, find, en index

Zoals beloofd, hier is de contains methode:

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

komt terug True. Je zou deze functie ook vanuit de instantie van de superstring kunnen aanroepen:

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

Maar doe het niet. Methoden die beginnen met onderstrepingstekens worden als semantisch privé beschouwd. De enige reden om dit te gebruiken is bij het uitbreiden van de in en not in functionaliteit (bijvoorbeeld bij subclassering 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')

en nu:

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

Vermijd ook de volgende stringmethoden:

>>> '**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 talen hebben mogelijk geen methoden om direct te testen op substrings, en dus zou je dit soort methoden moeten gebruiken, maar met Python is het veel efficiënter om de invergelijkingsoperator.

Prestatie vergelijkingen

We kunnen verschillende manieren vergelijken om hetzelfde doel te bereiken.

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

En nu zien we dat gebruiken in is veel sneller dan de anderen. Minder tijd om een ​​gelijkwaardige bewerking uit te voeren, is beter:

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



Nee, dat is er niet string.contains(str) methode, maar er is de in operator:

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

Hier is een complexer werkend voorbeeld:

# 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 en -lijsten

Hier zijn een paar nuttige voorbeelden die voor zichzelf spreken over de 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

Caveat. Lijsten zijn iterables, en de in methode werkt op iterables, niet alleen op strings.


31
2018-04-28 18:52