我有这样的东西:

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)

编辑:我有点被迫解释这与下面被标记为潜在重复的问题有什么不同(所以我猜它不会关闭)。

区别在于,我想检查字符串是否是某个字符串列表的一部分,而另一个问题是检查字符串列表中的字符串是否是另一个字符串的子字符串。相似,但不完全相同,当你在网上寻找答案时,语义很重要。这两个问题实际上是要解决彼此相反的问题。但两者的解决方案是一样的。


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

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

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


最好正确地解析URL -这样你就可以正确地处理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)

extensionsToCheck = ('.pdf', '.doc', '.xls')

'test.doc'.endswith(extensionsToCheck)   # returns True

'test.jpg'.endswith(extensionsToCheck)   # returns False

与任何发电机一起使用,在第一个True上短路:

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

编辑:我看到这个答案已经被op接受了。虽然我的解决方案可能是他特定问题的“足够好”的解决方案,并且是一个很好的通用方法来检查列表中的任何字符串是否在另一个字符串中找到,但请记住,这就是这个解决方案所做的一切。它不关心字符串在哪里被找到,例如在字符串的结尾。如果这很重要,就像url的情况一样,你应该看看@Wladimir Palant的答案,否则你可能会得到假阳性。


如果需要单行解决方案,请使用列表推导。下面的代码在包含。doc, .pdf和.xls扩展名时返回一个包含url_string的列表,在不包含扩展名时返回空列表。

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

注意:这只是为了检查它是否包含,当想要提取与扩展名匹配的确切单词时,这是没有用的。


这是@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”)


为了防止有人再次面临这样的任务,这里有另一个解决方案:

extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'file.doc'
res = [ele for ele in extensionsToCheck if(ele in url_string)]
print(bool(res))
> True

这是我能想到的最简单的方法。

list_ = ('.doc', '.txt', '.pdf')
string = 'file.txt'
func = lambda list_, string: any(filter(lambda x: x in string, list_))
func(list_, string)

# Output: True

同样,如果有人需要保存字符串中的元素,他们可以使用这样的方法:

list_ = ('.doc', '.txt', '.pdf')
string = 'file.txt'
func = lambda list_, string: tuple(filter(lambda x: x in string, list_))
func(list_, string)

# Output: '.txt'