我有字符串,
str='http://facebook.com/something/something/1.php'
有列表,
l= ['facebook','twitter']
我想检查str是否至少包含列表中的任何关键字。实现这一目标的最蟒蛇方式是什么?
我试过的是,
flag=0
for i in l:
if i in str:
print 'YES'
flag=1
break;
if flag==1:
#process something
答案 0 :(得分:4)
>>> s = 'http://facebook.com/something/something/1.php'
>>> l = ['facebook','twitter']
>>> any(x in s for x in l)
True
附注:不要将str
用作变量名。它会隐藏内置函数/类型str
。
答案 1 :(得分:3)
您可以使用any
和generator expression。
s = 'http://facebook.com/something/something/1.php'
l= ['facebook','twitter']
if any(i in s for i in l):
print('YES')
any(i in s for i in l)
将迭代l
并测试每个元素以查看它是否是s
的子字符串。如果找到子字符串,则迭代将停止,它将返回True
,否则它将继续直到完成,然后返回False
。
any
的免费方法是all
,如果全部为True
,则只返回True
(即所有字符串都是子字符串)。
答案 2 :(得分:1)
您可以使用
url = 'http://facebook.com/something/something/1.php'
patterns = ['facebook','twitter']
print('YES' if any(pattern in url for pattern in patterns) else 'False')
替代
print('YES' if any(url.find(pattern) > -1 for pattern in patterns) else 'False')
答案 3 :(得分:0)
接受正则表达式
这对我来说就是regex。你花时间学习正则表达式会得到很好的回报。
import re
str='http://facebook.com/something/something/1.php'
l = ['facebook','twitter']
# create the regex
re_l = '|'.join(l)
if re.search(re_l, str):
print "yes"
# do something
这将比任何其他替代方案更快,并允许您微调事物。 e.g。
# precompile the regex so it only gets done once
re_l = re.compile('|'.join(ll))
# not faster for one but if you reuse it this is faster.
if re_l.search(str):
print "doing something"
BTW,因为您正在查看此示例中的域名,您可以轻松添加re.IGNORECASE标志re.compile('|'.join(ll), re.I)