如何检查字符串是否包含Python中列表中的元素

poo*_*zko 184 python string if-statement

我有这样的事情:

extensionsToCheck = ['.pdf', '.doc', '.xls']

for extension in extensionsToCheck:
    if extension in url_string:
        print(url_string)
Run Code Online (Sandbox Code Playgroud)

我想知道在python中更优雅的方式是什么(不使用for循环)?我在考虑这样的事情(比如来自c/c ++),但它不起作用:

if ('.pdf' or '.doc' or '.xls') in url_string:
    print(url_string)
Run Code Online (Sandbox Code Playgroud)

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

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

Lau*_*low 348

使用发电机any,第一个发生短路:

if any(ext in url_string for ext in extensionsToCheck):
    print(url_string)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我想知道当any()返回True时ext是什么? (4认同)
  • 这正是我要找的。在我的情况下,字符串中的哪个位置是扩展名并不重要。谢谢 (3认同)

eum*_*iro 39

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

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

'test.jpg'.endswith(extensionsToCheck)   # returns False
Run Code Online (Sandbox Code Playgroud)

  • 这个很聪明 - 我不知道元组可以做到这一点!但它只有当你的子串被锚定到字符串的一端时才有效. (4认同)
  • 很酷.我只是希望有一些类似"包含"而不仅仅是开头或结尾 (3认同)
  • @ShekharSamanta 当然可以,但这并不能解决检查字符串中是否有多个事物之一的问题,这就是原始问题的所在。 (2认同)

Wla*_*ant 18

这是更好地解析正确的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)
Run Code Online (Sandbox Code Playgroud)


psu*_*sun 9

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

print [url_string for extension in extensionsToCheck if(extension in url_string)]
Run Code Online (Sandbox Code Playgroud)

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


Fab*_*abi 9

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

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


Dan*_*nid 5

这是@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)])
Run Code Online (Sandbox Code Playgroud)

['.doc']`

如果您想在已知匹配模式后收集其他信息,您还可以插入正则表达式(当允许的模式列表太长而无法写入单个正则表达式模式时,这可能很有用)

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

['foo.doc']