我知道可以使用string.find()
在字符串中查找子字符串。
但是,有没有一种最简单的方法可以在不使用循环的情况下查找数组项中是否有子字符串匹配字符串?
伪代码:
string = 'I would like an apple.'
search = ['apple','orange', 'banana']
string.find(search) # == True
any(x in string for x in search)
生成器表达式是括号内的部分,它创建一个可迭代对象,对于元组search中的每个x,返回x in string
的值。 x in string
进而返回string
是否包含子字符串x
。最后,Python内置函数any()
遍历传递给它的可迭代对象,并返回其中任何一个项是否为True
。import re
re.search("|".join(search), string)
我会选择第一个解决方案,因为正则表达式有一些缺陷(如转义等)。
Python中的字符串是序列,您可以通过查询一个字符串是否存在于另一个字符串中来进行快速成员测试:
>>> mystr = "I'd like an apple"
>>> 'apple' in mystr
True
Sven 的第一个回答是正确的。要检查某个字符串中是否存在多个字符串中的任意一个,可以使用以下代码:
>>> ls = ['apple', 'orange']
>>> any(x in mystr for x in ls)
True
>>> ls = ['apple', 'orange']
>>> all(x in mystr for x in ls)
False
>>> ls = ['apple', 'like']
>>> all(x in mystr for x in ls)
True
最简单的是
import re
regx = re.compile('[ ,;:!?.:]')
string = 'I would like an apple.'
search = ['apple','orange', 'banana']
print any(x in regx.split(string) for x in search)
编辑
纠正,在阅读了Sven的答案之后:显然,字符串不能被分割,太愚蠢了!any(x in string for x in search)
非常有效
如果你不想使用循环:
import re
regx = re.compile('[ ,;:!?.:]')
string = 'I would like an apple.'
search = ['apple','orange', 'banana']
print regx.split(string)
print set(regx.split(string)) & set(search)
结果
set(['apple'])
re.search("|".join(re.escape(search)), string)
。那么还有哪些陷阱需要注意呢? - eyquem