如何检查字符串是否包含 Python 列表中的元素
- 2025-01-06 08:32:00
- admin 原创
- 109
问题描述:
我有类似的东西:
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)
编辑:我不得不解释这与下面被标记为潜在重复的问题有何不同(所以我想它不会被关闭)。
不同之处在于,我想检查一个字符串是否是某个字符串列表的一部分,而另一个问题是检查字符串列表中的字符串是否是另一个字符串的子字符串。类似但不完全相同,在我看来,当您在网上寻找答案时,语义很重要。这两个问题实际上是在寻求解决彼此相反的问题。但两者的解决方案是一样的。
解决方案 1:
使用与的生成器any
,使第一个 True 短路:
if any(ext in url_string for ext in extensionsToCheck):
print(url_string)
编辑:我看到这个答案已被 OP 接受。虽然我的解决方案可能是针对他的特定问题的“足够好”的解决方案,并且是检查列表中的任何字符串是否在另一个字符串中找到的很好的通用方法,但请记住,这就是此解决方案所做的全部。它不关心字符串在哪里找到,例如在字符串的结尾。如果这很重要(就像 URL 中经常出现的情况一样),您应该查看 @Wladimir Palant 的答案,否则您可能会得到误报。
解决方案 2:
extensionsToCheck = ('.pdf', '.doc', '.xls')
'test.doc'.endswith(extensionsToCheck) # returns True
'test.jpg'.endswith(extensionsToCheck) # returns False
解决方案 3:
最好正确解析 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)
解决方案 4:
如果您想要单行解决方案,请使用列表推导。以下代码在 url_string 具有扩展名 .doc、.pdf 和 .xls 时返回包含该 url_string 的列表,在不包含扩展名时返回空列表。
print [url_string for extension in extensionsToCheck if(extension in url_string)]
注意:这只是为了检查它是否包含,当想要提取与扩展名精确匹配的单词时没有用。
解决方案 5:
如果有人再次面临这个任务,这里还有另一种解决方案:
extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'file.doc'
res = [ele for ele in extensionsToCheck if(ele in url_string)]
print(bool(res))
> True
解决方案 6:
这是@psun 给出的列表理解答案的变体。
通过切换输出值,您实际上可以从列表理解中提取匹配模式(any()
@Lauritz-v-Thaulow 的方法无法做到这一点)
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']
解决方案 7:
检查它是否与以下正则表达式匹配:
'(.pdf$|.doc$|.xls$)'
注意:如果你的扩展名不在网址末尾,请删除这些$
字符,但这会稍微削弱它
解决方案 8:
这是我能想到的最简单的方法:)
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'