我有这样的事情:
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)
编辑:我有点不得不解释这与下面的问题有什么不同,后者被标记为潜在重复(因此我猜不会关闭)。
不同之处在于,我想检查字符串是否是某些字符串列表的一部分,而另一个问题是检查字符串列表中的字符串是否是另一个字符串的子字符串。当你在线寻找答案时,类似但不完全相同的事物和语义很重要。这两个问题实际上是在寻求解决彼此相反的问题。两者的解决方案结果都是相同的。
答案 0 :(得分:305)
将发生器与any
一起使用,这会在第一个True:
if any(ext in url_string for ext in extensionsToCheck):
print(url_string)
编辑:我看到此答案已被OP接受。虽然我的解决方案可能足够好"解决他的特定问题,并且是检查列表中的任何字符串是否在另一个字符串中找到的一种很好的通用方法,请记住这就是这个解决方案所做的全部。 它并不关心在哪里找到字符串,例如在字符串的结尾。如果这很重要,就像网址的情况一样,你应该看看@Wladimir Palant的答案,否则你可能会得到误报。
答案 1 :(得分:28)
extensionsToCheck = ('.pdf', '.doc', '.xls')
'test.doc'.endswith(extensionsToCheck) # returns True
'test.jpg'.endswith(extensionsToCheck) # returns False
答案 2 :(得分:16)
最好正确解析网址 - 这样您就可以正确处理http://.../file.doc?foo
和http://.../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)
答案 3 :(得分:2)
检查它是否与此正则表达式匹配:
'(\.pdf$|\.doc$|\.xls$)'
注意:如果您的扩展程序不在网址的末尾,请删除$
个字符,但它会稍微削弱它
答案 4 :(得分:2)
如果您需要单行解决方案,请使用列表推导。以下代码返回包含url_string的列表,当它具有扩展名.doc,.pdf和.xls时,或者在不包含扩展名时返回空列表。
print [url_string for extension in extensionsToCheck if(extension in url_string)]
注意:这只是为了检查它是否包含,并且当想要提取与扩展名匹配的确切单词时没用。
答案 5 :(得分:1)
这是@psun给出的列表理解答案的变体。
通过切换输出值,您实际上可以从列表推导中提取匹配模式(@ 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']`
如果要在匹配的模式已知时收集其他信息,则可以进一步插入正则表达式(当允许的模式列表太长而无法写入单个正则表达式模式时,这可能很有用)
print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)]
['foo.doc']
答案 6 :(得分:1)
以防万一有人再次面临这个任务,这里有另一个解决方案:
extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'file.doc'
res = [ele for ele in extensionsToCheck if(ele in url_string)]
print(bool(res))
> True