2011-06-30 32 views
95

列表中的元素我有这样的事情:如何检查是否字符串包含在Python

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

for extension in extensionsToCheck: 
    if extension in url_string: 
     print(url_string) 

我想知道这将是更优雅的方式在Python做到这一点(不使用的循环)?我在想这样的事情(比如从C/C++),但没有奏效:

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

注:

if ('.pdf' or '.doc' or '.xls') in url_string: 
    print(url_string) 
+2

使用列表理解 –

+0

@AndreasJung有一个框。你在外面想过。 – Pyderman

+2

[检查是否有多个字符串存在于另一个字符串]可能的重复(http://stackoverflow.com/questions/3389574/check-if-multiple-strings-exist-in-another-string) – GingerPlusPlus

回答

198

使用发电机any在一起,这对第一个真正的短路:

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

编辑:我看到这个答案已被接受OP。尽管我的解决方案对于他的特定问题可能是“足够好”的解决方案,并且是检查列表中的任何字符串是否在另一个字符串中找到的好方法,但请记住,这是解决方案所做的一切。它不在意,其中字符串被找到。如果这一点很重要,就像网站经常出现的情况一样,您应该看看@Wladimir Palant的答案,否则您有可能冒着误报的风险。

+1

这正是我正在寻找。在我的情况下,在字符串中的哪个位置是扩展名并不重要。谢谢 – pootzko

+0

很棒的建议。使用这个例子,我检查是否有任何参数匹配众所周知的帮助标志:any([' '] for x in sys.argv [1:]]) –

+0

@ AX-Labs在'any'内部使用列表解析将会否定短路提供的一些可能的收益,因为整个列表必须在每一种情况下被构建。如果你在sys.argv [1:]中使用没有方括号的表达式(在[' - ?',' - h',' - help','/ h']'中的任何(x.lower() )'',''部分中的'x.lower()'将被评估,直到找到一个真值。 –

2

检查其是否与此正则表达式匹配,如果你扩展不在URL的末尾,去掉$字符,但它不会削弱它稍微

+1

这是一个URL,如果它有一个查询字符串? –

+0

import re.search(pattern,your_string) – juankysmith

+0

虽然此答案适用于指定的情况,但它不是可缩放的或通用的。对于每个你想匹配的模式,你都需要一个很长的正则表达式。 – Dannid

12

这是更好地解析正确的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) 
22
extensionsToCheck = ('.pdf', '.doc', '.xls') 

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

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

这个是聪明的 - 我不知道元组可以做到这一点!,但它只适用于当你的子字符串锚定到字符串的一端时。 – Dannid

+1

方式很酷。我只是希望有一些像“包含”而不仅仅是开始或结束于 – BrDaHa

2

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

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

注意:这仅仅是检查它是否包含与否,而不是有用的,当一个人想提取确切的词相匹配的扩展。

+0

虽然这段代码可能回答这个问题,但提供关于为什么和/或它如何回答问题的附加上下文会显着提高其长期价值。请[编辑]你的答案,添加一些解释。 – CodeMouse92

+0

这比“任何”解决方案更具可读性,在我看来,这是解决这个问题最好的解决方案之一。 –

+0

在我看来,这个优于any()解决方案,因为它可以被修改为返回特定的匹配值,如下所示:'print [extensionTo extensionToCheck if(在url_string中的扩展名)]'(请参阅我的答案以获取更多详细信息以及如何从url_string中提取匹配_word_以及模式) – Dannid

0

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

,如果你想收集更多的信息,一旦匹配的模式是已知的(在允许的模式的列表太长写入到一个单一的正则表达式,这可能是有用的,您可以进一步插入一个正则表达式模式)

​​

['foo.doc']

相关问题