基于结尾过滤字符串列表的 Python 脚本

tzi*_*ppy 5 python string filter

我不知道任何 python,但我需要稍微自定义一个脚本。脚本中解析了字符串并放入列表中(我猜)。然后根据它们是否以“http”开头来过滤这些字符串。我想添加的是基于文件扩展名的过滤器。所有以html或结尾的链接都xml将被过滤。

这是过滤所有超链接的代码:

links = filter (lambda x:x.startswith("http://") , links) 
Run Code Online (Sandbox Code Playgroud)

我不知道为类似的东西放置 OR 运算符的正确语法 .endswith(".html) OR .endswith("xml")

我知道这会过滤所有以 结尾的链接,.html但我也需要这些.xml链接。

links = filter (lambda x:x.startswith("http://") , links) 
links = filter (lambda x:x.endswith(".html") , links) 
Run Code Online (Sandbox Code Playgroud)

Pet*_*per 7

如果您至少使用 2.5,则可以将后缀元组传递给endswith. 感谢@hcwhsa 指出这一点:

links = filter(lambda x:x.endswith((".html", ".xml")), links)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是早期版本,则可以使用or运算符:

links = filter(lambda x:x.endswith(".html") or x.endswith(".xml"), links) 
Run Code Online (Sandbox Code Playgroud)

尽管如果您不确定 x 是否已经小写,您会想要小写 x。

我可能会使用生成器表达式而不是 来做到这一点filter,当然也不会连续调用filter

links = [link for link in links if link.startswith('http://') and link.endswith(('.html', '.xml'))]
Run Code Online (Sandbox Code Playgroud)


itd*_*xer 0

我认为最好的方法是用正则表达式检查这个

>>> import re
>>> c = r"^http://.+\.(html|xml)"
>>> re.match(c, 'hello')
>>> re.match(c, 'http://data.com/word.html')
<_sre.SRE_Match object at 0x1d2a100>
Run Code Online (Sandbox Code Playgroud)

答案将是

import re
regex = r"^http://.+\.(html|xml)"
links = filter(lambda x: re.match(regex, x), links)
Run Code Online (Sandbox Code Playgroud)