it-swarm.com.ru

Есть ли в Python метод "содержит" подстроку для строки?

Я ищу метод string.contains или string.indexof в Python.

Я хочу делать:

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

Вы можете использовать оператор in :

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

Если это просто поиск по подстроке, вы можете использовать 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. Это может или не может быть то, что вы хотите.

534
eldarerathis

if needle in haystack: - это обычное использование, как говорит @Michael, - оно полагается на оператор in , более читабельно и быстрее, чем вызов метода.

Если вам действительно нужен метод вместо оператора (например, чтобы сделать какой-то странный key= для очень своеобразного рода ...?), Это будет 'haystack'.__contains__ . Но так как ваш пример предназначен для использования в if, я думаю, вы на самом деле не имеете в виду то, что говорите ;-). Непригодно (ни читабельно, ни эффективно) напрямую использовать специальные методы - они предназначены для использования вместо них через операторы и встроенные функции, которые им делегируют.

148
Alex Martelli

По сути, вы хотите найти подстроку в строке в Python. Есть два способа поиска подстроки в строке в Python.

Метод 1: оператор in

Вы можете использовать оператор Python in для проверки подстроки. Это довольно просто и интуитивно понятно. Он вернет True, если подстрока была найдена в строке else False.

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

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

Метод 2: str.find() метод

Второй метод заключается в использовании метода str.find(). Здесь мы вызываем метод .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 более или менее можно найти в модуле operator включая in.

15
Jeffrey04

В Python есть два простых способа добиться этого:

Pythonic way: Использование Python's in in Keyword-

in принимает два «аргумента», один слева (substring) и один справа, и возвращает True, если левый аргумент содержится в аргументе правой стороны и, если нет, возвращает False.

example_string = "This is an example string"
substring = "example"
print(substring in example_string)

Результат:

True

Непитоновский способ: использование str.find Python:

Метод find возвращает позицию строки в строке или -1, если она не найдена. Но просто проверьте, если позиция не -1.

if example_string.find(substring) != -1:
    print('Substring found!')
else:
    print('Substring not found!')

Результат:

Substring found!
14
Inconnu

Я вижу, что уже есть ответы, но я также хочу добавить свои два цента.

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

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

Существует четыре простейших способа узнать, что такое подстрока и где начинается подстрока.

Первый из них через оператор Pythonin:

someString = "Polly is drinking Coca-Cola."

"Coca-Cola" in someString
# Result: True

"Pepsi" in someString
# Result: False

Второй способ - использовать методfind()для строки.

В отличие от оператораin, который оценивается как значение boolean , метод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

Если вы ищете поиск по словам без учета регистра, а не подстроку, содержащуюся в другом слове:

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