ChatGPT解决这个技术问题 Extra ChatGPT

如何检查字符串是否包含 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)

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

不同之处在于,我想检查一个字符串是否是某个字符串列表的一部分,而另一个问题是检查一个字符串列表中的字符串是否是另一个字符串的子字符串。当您在线寻找答案恕我直言时,类似但不完全相同,语义很重要。这两个问题实际上是在寻求解决彼此相反的问题。两者的解决方案结果是相同的。

我不确定你的最后一段是什么意思。您确实想检查字符串列表(文件扩展名)中的一个字符串是否是另一个字符串(url)的子字符串。

N
Nam G VU

将生成器与 any 一起使用,它会在第一个 True 上短路:

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

编辑:我看到这个答案已被 OP 接受。尽管我的解决方案可能是针对他的特定问题的“足够好”的解决方案,并且是检查列表中的任何字符串是否在另一个字符串中找到的一种很好的通用方法,但请记住,这就是该解决方案所做的全部。它不关心字符串在哪里找到,例如在字符串的结尾。如果这很重要,就像 url 的情况一样,您应该查看@Wladimir Palant 的答案,否则您可能会遇到误报。


这正是我想要的。在我的情况下,字符串中的扩展名在哪里并不重要。谢谢
很好的建议。使用此示例,这就是我检查任何参数是否与众所周知的帮助标志匹配的方式: any([x.lower() in ['-?','-h','--help', '/h '] for x in sys.argv[1:]])
@AXE-Labs 在 any 中使用列表推导将否定短路提供的一些可能的收益,因为必须在每种情况下构建整个列表。如果您使用不带方括号 (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])) 的表达式,则只会计算 x.lower() in [...] 部分,直到找到 True 值。
如果我想知道任何()返回True时的ext是什么?
@PeterSenna:any() 只会返回 truefalse,但请参阅下面的 @psun 的列表理解答案,并进行以下修改:print [extension for extension in extensionsToCheck if(extension in url_string)]
e
eumiro
extensionsToCheck = ('.pdf', '.doc', '.xls')

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

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

这个很聪明 - 我不知道元组可以做到这一点!但它仅在您的子字符串锚定到字符串的一端时才有效。
太酷了我只是希望有像“包含”这样的东西,而不是仅仅以开头或结尾
@BrDaHa 您可以将 'in' 用于 contains 。如果“字符串”在列表中:
@ShekharSamanta 当然,但这并不能解决检查多个事物中的一个是否在字符串中的问题,这就是最初的问题。
是的,在这种情况下,我们可以使用:if any(string.split('any delmiter') for element in list) & for string if any(element in string.split('any delmiter') for element in list) & for string if any(element in string for element in list)
W
Wladimir Palant

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

A
Aidos

以防万一有人再次面临此任务,这是另一种解决方案:

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

p
psun

如果您想要单行解决方案,请使用列表推导。以下代码在具有扩展名 .doc、.pdf 和 .xls 时返回包含 url_string 的列表,或者在不包含扩展名时返回空列表。

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

注意:这仅用于检查它是否包含,并且在想要提取与扩展名匹配的确切单词时没有用。


这比 any 解决方案更具可读性,在我看来,它是该问题的最佳解决方案之一。
在我看来,这个解决方案优于 any() 解决方案,因为它也可以更改为返回特定的匹配值,如下所示:print [extension for extension in extensionsToCheck if(extension in url_string)](有关更多详细信息以及如何提取匹配的 word,请参阅我的答案 以及来自 url_string 的模式)
佚名

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

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

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


它是一个 URL,如果它有一个查询字符串怎么办?
导入 re.search(pattern, your_string)
虽然此答案适用于特定情况,但它不可扩展或通用。对于要匹配的每个模式,您都需要一个很长的正则表达式。
D
Dannid

这是@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']


嗨@Dannid。当我尝试您的解决方案时,我收到指向“for”的语法错误。也许自从你的帖子以来,python 中有一个更新需要一些不同的语法?希望您能够帮助我。谢谢