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

如何在Python中检查字符串是否包含列表中的元素,python,string,if-statement,Python,String,If Statement,我有这样的想法: 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')

我有这样的想法:

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)

将发电机与
any
一起使用,该发电机在第一时间短路:

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

编辑:我看到OP已经接受了这个答案。虽然我的解决方案可能是解决他特定问题的“足够好”的解决方案,并且是检查列表中的任何字符串是否在另一个字符串中找到的一种很好的通用方法,但请记住,这就是这个解决方案的全部功能它不关心字符串的位置,例如在字符串的结尾处。如果这一点很重要,就像URL的情况一样,您应该查看@Wladimir Palant的答案,否则可能会出现误报。

如果您想要单行解决方案,请使用列表理解。以下代码在扩展名为.doc、.pdf和.xls时返回包含url_字符串的列表,或者在不包含扩展名时返回空列表

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

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

这是@psun给出的列表理解答案的变体

通过切换输出值,您实际上可以从列表理解中提取匹配模式(使用@Lauritz-v-Thaulow的
any()
方法是不可能的)

['.doc']`

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

['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

这是一个URL,如果它有一个查询字符串呢?导入重新搜索(模式,您的字符串)虽然这个答案适用于指定的情况,但它不是可伸缩的或通用的。要匹配的每个模式都需要一个长正则表达式。这正是我想要的。在我的例子中,扩展名在字符串中的什么位置并不重要。谢谢你的建议。使用此示例,我将检查任何参数是否与众所周知的帮助标志匹配:any(['-?'、'-h'、'-help'、'-help'、'/h']中的[x.lower(),对于sys.argv[1:]]中的x)@AXE实验室在
any
中使用列表理解将否定短路提供的一些可能收益,因为在任何情况下都必须建立完整的列表。如果在sys.argv[1:]中为x使用不带方括号的表达式(
any(['-?'、'-h'、'-help'、'/h']),
),则[…]部分中的
x.lower()将只在找到真值之前进行计算。如果我想知道any()返回真值时的ext是什么?@PeterSenna:
any()
将只返回真或假,但是,通过此修改,请参见下面@psun的列表理解答案:
print[extensions-for-extension-in-extensions-tocheck if(extension-in-url\u-string)]
可能的副本比
任何解决方案更具可读性,在我看来,这是解决这个问题的最佳方案之一。在我看来,这一方案优于
any()
方案,因为它也可以修改以返回特定的匹配值,例如:
print[extension for extension in extensions tocheck if(extension in url\u string)]
(有关更多详细信息以及如何从url_字符串中提取匹配单词和模式,请参见我的答案)这一个很聪明-我不知道元组可以做到这一点!但它只在子字符串锚定到字符串一端时才起作用。太酷了。我只希望有“包含”这样的东西而不仅仅是开始与或endswith@BrDaHa您可以将“in”用于contains。如果列表中的“string”为@ShekharSamanta,当然可以,但这并不能解决检查字符串中是否有多个内容之一的问题,这就是原始问题所在。是的,在这种情况下,我们可以使用:if any(string.split中的元素('any delmiter'))用于列表中的元素)和字符串(如果有)(字符串中的元素用于列表中的元素)
extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'http://.../foo.doc'

print [extension for extension in extensionsToCheck if(extension in url_string)]
print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)]
extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'file.doc'
res = [ele for ele in extensionsToCheck if(ele in url_string)]
print(bool(res))
> True