others - python 是否有字符串'包含'子字符串方法?

我正在查找 python 中的string.contains 或者 string.indexof 方法。

我想做的是:


if not somestring.contains("blah"):


 continue



时间:

你可以使用 in 运算符:


if"blah" not in somestring: 


 continue



如果是子字符串搜索,你可以使用 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:

if needle in haystack: 正常使用,@Michael 表示--依赖 in,运算符,比方法调用更加可以读更快。

如果真的需要一个方法而不是操作符( 比如 。 要做一些奇怪的key= 以非常特殊的排序。that ),那将是 'haystack'.__contains__ 。 但是,由于你的示例是用于 if的,所以我想你并不真的意味着你所说的。 用特殊方法直接使用(,也,) 并不好,而是通过操作符和委托给它们的内置方法来实现。

基本上,你想在 python 中查找字符串中的子字符串。 在 python 中搜索字符串中的子字符串有两种方法。

方法 1: in 运算符

你可以使用 python 运算符的in 来检查子字符串。 它非常简单直观。 如果字符串中找到了子字符串,它将返回 True


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


True



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


False



方法 2: str.find() 方法

第二种方法是使用 str.find() 方法。 我们将子字符串传递给 find() 方法并检查它的返回值。 如果其值不是 -1,则在字符串中找到子字符串,否则没有。 返回的值是找到子字符串的索引。


>>> some_string ="valar morghulis"



>>> some_string.find("morghulis")


6



>>> some_string.find("dohaeris")


-1



我建议你使用第一种方法,因为它更 Pythonic 和直观。

没有 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 ]



python 是否有字符串包含子字符串方法?


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


True




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



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



警告。列表是 iterables,in 方法作用于 iterables,而不仅仅是字符串。

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



另一种查找字符串是否包含几个字符的方法( 例如 返回值) 。 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



在 python 中,可以实现以下两种简单的方法:

如果左侧参数包含在 in 上,则返回2,如果左参数包含在rightside参数中,则返回 True,否则返回 False,返回2.


example_string ="This is an example string"


substring ="example"


print(substring in example_string)



输出:

 
True



 

使用 pythonic: 使用 python的str.find:

find 方法返回字符串中字符串的位置,如果未找到,则返回 -1. 但只需检查位置是否为 -1.


if example_string.find(substring)!= -1:


 print('Substring found!')


else:


 print('Substring not found!')



输出:

 
Substring found!



 
...