如何检查一个string是否包含Python中列表中的一个元素

我有这样的东西:

extensionsToCheck = ['.pdf', '.doc', '.xls'] for extension in extensionsToCheck: if extension in url_string: print(url_string) 

我想知道什么是更优雅的方式来做到这一点在python(不使用for循环)? 我想这样的事情(如从C / C + +),但它没有工作:

 if ('.pdf' or '.doc' or '.xls') in url_string: print(url_string) 

any一个发生器一起使用,其中第一个真短路:

 if any(ext in url_string for ext in extensionsToCheck): print(url_string) 

编辑:我看到这个答案已被OP接受。 虽然我的解决scheme可能对于他的特定问题是“足够好的”解决scheme,并且是检查列表中的任何string是否在另一个string中被find的好方法,请记住,这是解决scheme所做的一切。 它不关心在哪里findstring。 如果这一点很重要,就像网站经常出现的情况一样,你应该看看@Wladimir Palant的答案,否则你可能冒着误报的风险。

 extensionsToCheck = ('.pdf', '.doc', '.xls') 'test.doc'.endswith(extensionsToCheck) # returns True 'test.jpg'.endswith(extensionsToCheck) # returns False 

最好是正确地parsingURL – 这样你可以正确处理http://.../file.doc?foohttp://.../foo.doc/file.exe

 from urlparse import urlparse import os path = urlparse(url_string).path ext = os.path.splitext(path)[1] if ext in extensionsToCheck: print(url_string) 

检查它是否匹配这个正则expression式:

 '(\.pdf$|\.doc$|\.xls$)' 

请注意:如果您的扩展程序不在url的末尾,请删除$字符,但会稍微削弱它

如果您想要单行解决scheme,请使用列表parsing。 下面的代码在扩展名为.doc,.pdf和.xls时返回一个包含url_string的列表,或者在不包含扩展名时返回空列表。

 print [url_string for extension in extensionsToCheck if(extension in url_string)] 

注意:这只是用来检查是否包含扩展名,当用户想要提取与扩展名相匹配的确切单词时,该function是无用的。

这是@psun给出的列表理解答案的变体。

通过切换输出值,您实际上可以从列表理解中提取匹配模式any() @ Lauritz-v-Thaulow的any()方法是不可能的)

 extensionsToCheck = ['.pdf', '.doc', '.xls'] url_string = 'http://.../foo.doc' print [extension for extension in extensionsToCheck if(extension in url_string)] 

[ '.DOC']`

如果要在匹配模式已知时收集更多信息,则可以插入正则expression式(当允许的模式列表太长而无法写入单个正则expression式模式时,这可能非常有用)

 print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)] 

['foo.doc']