检查字符串的大多数pythonic方法包含也存在于列表中的子字符串

时间:2014-09-24 13:40:33

标签: python string list python-2.7

我有字符串,

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

4 个答案:

答案 0 :(得分:4)

使用anygenerator expression

>>> s = 'http://facebook.com/something/something/1.php'
>>> l = ['facebook','twitter']
>>> any(x in s for x in l)
True

附注:不要将str用作变量名。它会隐藏内置函数/类型str

答案 1 :(得分:3)

您可以使用anygenerator 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)