it-swarm-vi.com

Python có phương thức chuỗi con 'chứa' không?

Tôi đang tìm kiếm một phương thức string.contains hoặc string.indexof trong Python.

Tôi muốn làm:

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

Bạn có thể sử dụng toán tử in :

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

Nếu đó chỉ là một tìm kiếm chuỗi con, bạn có thể sử dụng string.find("substring").

Tuy nhiên, bạn phải cẩn thận một chút với find, indexin, vì chúng là các tìm kiếm chuỗi con. Nói cách khác, điều này:

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

Nó sẽ in Found 'is' in the string. Tương tự, if "is" in s: sẽ đánh giá thành True. Điều này có thể hoặc không thể là những gì bạn muốn.

534
eldarerathis

if needle in haystack: là cách sử dụng bình thường, như @Michael nói - nó phụ thuộc vào toán tử in , dễ đọc hơn và nhanh hơn so với lệnh gọi phương thức.

Nếu bạn thực sự cần một phương thức thay vì một toán tử (ví dụ: để thực hiện một số key= kỳ lạ cho một loại rất đặc biệt ...?), Đó sẽ là 'haystack'.__contains__ . Nhưng vì ví dụ của bạn là để sử dụng trong if, tôi đoán bạn không thực sự có nghĩa là những gì bạn nói ;-). Đây không phải là hình thức tốt (cũng không thể đọc, cũng không hiệu quả) để sử dụng trực tiếp các phương pháp đặc biệt - thay vào đó, chúng được sử dụng thông qua các toán tử và nội trang được ủy quyền cho chúng.

148
Alex Martelli

Về cơ bản, bạn muốn tìm một chuỗi con trong một chuỗi trong Python. Có hai cách để tìm kiếm một chuỗi con trong một chuỗi trong Python.

Phương thức 1: Toán tử in

Bạn có thể sử dụng toán tử in của Python để kiểm tra chuỗi con. Nó khá đơn giản và trực quan. Nó sẽ trả về True nếu chuỗi con được tìm thấy trong chuỗi khác False.

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

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

Phương pháp 2: Phương thức str.find()

Phương pháp thứ hai là sử dụng phương thức str.find(). Ở đây, chúng ta gọi phương thức .find() trên chuỗi trong đó chuỗi con sẽ được tìm thấy. Chúng ta truyền chuỗi con cho phương thức find () và kiểm tra giá trị trả về của nó. Nếu giá trị của nó khác -1, chuỗi con được tìm thấy trong chuỗi, nếu không thì không. Giá trị được trả về là chỉ mục nơi chuỗi con được tìm thấy.

>>> some_string = "valar morghulis"

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

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

Tôi khuyên bạn nên sử dụng phương pháp đầu tiên vì nó mang tính Pythonic và trực quan hơn.

137
Rahul Gupta

Python có một chuỗi chứa phương thức chuỗi con không?

Có, nhưng Python có một toán tử so sánh mà bạn nên sử dụng thay thế, vì ngôn ngữ dự định sử dụng nó và các lập trình viên khác sẽ mong đợi bạn sử dụng nó. Từ khóa đó là in, được sử dụng làm toán tử so sánh:

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

Ngược lại (bổ sung), mà câu hỏi ban đầu yêu cầu, là not in:

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

Điều này về mặt ngữ nghĩa giống như not 'foo' in '**foo**' nhưng nó dễ đọc hơn và được cung cấp rõ ràng bằng ngôn ngữ như một sự cải thiện khả năng đọc.

Tránh sử dụng __contains__, findindex

Như đã hứa, đây là phương thức contains:

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

trả về True. Bạn cũng có thể gọi hàm này từ thể hiện của siêu chuỗi:

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

Nhưng đừng. Các phương thức bắt đầu bằng dấu gạch dưới được coi là riêng tư về mặt ngữ nghĩa. Lý do duy nhất để sử dụng điều này là khi mở rộng chức năng innot in (ví dụ: nếu phân lớp 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')

và bây giờ:

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

Ngoài ra, tránh các phương thức chuỗi sau:

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

Các ngôn ngữ khác có thể không có phương pháp để kiểm tra trực tiếp các chuỗi con và vì vậy bạn sẽ phải sử dụng các loại phương thức này, nhưng với Python, sử dụng toán tử so sánh in sẽ hiệu quả hơn nhiều.

So sánh hiệu suất

Chúng ta có thể so sánh nhiều cách khác nhau để hoàn thành cùng một mục tiêu.

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

Và bây giờ chúng ta thấy rằng sử dụng in nhanh hơn nhiều so với những người khác . Ít thời gian hơn để thực hiện một thao tác tương đương là tốt hơn:

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

Không, không có bất kỳ phương thức string.contains(str) nào, nhưng có toán tử in:

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

Đây là một ví dụ làm việc phức tạp hơn:

# 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 Chuỗi và danh sách Python

Dưới đây là một vài ví dụ hữu ích tự nói về phương pháp 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

Hãy cẩn thận. Danh sách là các lần lặp và phương thức in hoạt động trên các lần lặp, không chỉ các chuỗi.

38
firelynx

Vì vậy, rõ ràng không có gì tương tự để so sánh vector-khôn ngoan. Một cách rõ ràng để làm như vậy là:

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

Một cách khác để tìm xem một chuỗi có chứa một vài ký tự hay không với giá trị trả về Boolean (tức là True hoặc `Sai):

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

Bạn có thể sử dụng y.count()

nó sẽ trả về giá trị nguyên của số lần một chuỗi con xuất hiện trong một chuỗi.

Ví dụ:

string.count("bah") >> 0
string.count("Hello") >> 1
16
Brandon Bailey

Nếu bạn hài lòng với "blah" in somestring nhưng muốn nó là một cuộc gọi chức năng, có lẽ bạn có thể làm điều này

import operator

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

Tất cả các toán tử trong Python có thể được tìm thấy ít nhiều trong mô đun toán tử bao gồm in.

15
Jeffrey04

Trong Python có hai cách đơn giản để bạn có thể đạt được điều này:

Cách Pythonic: Sử dụng từ khóa 'trong' của Python-

in nhận hai "đối số", một ở bên trái (chuỗi con) và một ở bên phải và trả về True nếu đối số bên trái được chứa trong đối số quyền và nếu không, nó sẽ trả về False.

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

Đầu ra:

True

Cách không phải Pythonic: Sử dụng str.find của Python:

Phương thức find trả về vị trí của chuỗi trong chuỗi hoặc -1 nếu không tìm thấy. Nhưng chỉ cần kiểm tra nếu vị trí không -1.

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

Đầu ra:

Substring found!
14
Inconnu

Tôi thấy đã có câu trả lời, nhưng tôi cũng muốn thêm hai xu của mình.

Trong Python có các hàm để làm điều này, nhưng phương thức đơn giản nhất (và được ưa thích nhất) là sử dụng từ khóa 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

Có một số phương thức chuỗi là:

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

Về hiệu suất:

Nói chung, in là phương pháp nhanh nhất để tìm một chuỗi con ... 

find nhanh hơn một chút so với index.

12
Fipsi

Đây là câu trả lời của bạn:

if "insert_char_or_string_here" in "insert_string_to_search_here":
    #DOSTUFF

Để kiểm tra nếu nó sai:

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

HOẶC LÀ:

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

Có bốn cách đơn giản nhất để tìm ra chuỗi con là gì và chuỗi con bắt đầu từ đâu.

Cái đầu tiên là thông qua toán tử Python từ in:

someString = "Polly is drinking Coca-Cola."

"Coca-Cola" in someString
# Result: True

"Pepsi" in someString
# Result: False

Cách thứ hai là sử dụng phương thức chuỗi find().

Không giống như toán tử in được ước tính thành giá trị boolean, phương thức find trả về một số nguyên. Số nguyên này là chỉ số bắt đầu của một chuỗi con nếu chuỗi con này tồn tại, nếu không thì -1 được trả về. Đây là cách nó hoạt động:

someString = "Polly is drinking Coca-Cola."

someString.find("is")
# Result: 6

someString.find("Pepsi")
# Result: -1

someString.find("Polly")
# Result: 0

Bạn cũng có thể chỉ định các chỉ số bắt đầu và kết thúc để giới hạn tìm kiếm của bạn. Ví dụ:

someString = "Polly is drinking Coca-Cola."

someString.find("is", 5, 10)
# Result: 6

someString.find("Polly", 15, 20)
# Result: -1

Thứ ba. Và, tất nhiên, bạn có thể sử dụng câu lệnh if...is not (nó hoạt động trong Python 2.7 và 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!"

Bốn. Sử dụng phương thức index(). Nó gần giống như phương thức find().

someString = "Polly is drinking Coca-Cola."
x = someString.index("drinking")
print(x)

# Result: 9

Hi vọng điêu nay co ich.

11
ARGeo

Nếu bạn đang tìm kiếm tìm kiếm không phân biệt chữ hoa chữ thường, thay vì một chuỗi con có trong một từ khác:

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

Như đã nói trước đây, bạn có thể sử dụng toán tử in như thế này:

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

Ngoài ra, bạn có thể sử dụng các biểu thức thông thường để có được các lần xuất hiện:

>>> import re
>>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space
['t', ' ', 't', ' ', ' ']
1
Muskovets

Có rất nhiều câu trả lời. 

Nhưng sử dụng count cũng có thể có ích.

thí dụ:

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