【问题标题】:get all occurence with findall in python在 python 中使用 findall 获取所有出现
【发布时间】:2015-12-28 21:45:45
【问题描述】:

我需要获取“relay.albacom.net”和“smtp.albacom.net”

import re

string="""<tr bgcolor="#d3ebf8"><td>Albacom</td><td>relay.albacom.net</td><td></td></tr><tr bgcolor="#d3ebf8"><td>Albacom</td><td>smtp.albacom.net</td><td></td></tr>"""

test=re.findall(r'<tr bgcolor="#d3ebf8"><td>.*</td><td>(.*)</td><td>.*</td></tr>', string)

print test

但是,我只收到['smtp.albacom.net']

下面的.* 表示任何字符对吗?所以它应该工作......

谢谢!

【问题讨论】:

  • 输出正确,看here。关键是第一个.* 将匹配整个字符串,然后该模式在捕获组之后只需要1 TD。因此,您将获得最后一个单元格的内容。

标签: python regex findall


【解决方案1】:

使用非贪心选择器:

<tr bgcolor="#d3ebf8"><td>.*?</td><td>(.*?)</td><td>.*?</td></tr>

当您使用 .* 而不使用 ? 正则表达式时,请尝试为该表达式捕获尽可能多的字符。但是添加一个?,强制它尽可能少地选择。

Check this sample

【讨论】:

    【解决方案2】:
    test = re.findall('[a-z]+\.albacom\.[a-z]+',string)
    

    我相信这应该允许您以更通用的方式在 .albacom. 形式的字符串中找到项目。

    【讨论】:

    • 他不知道这些 URL 将包含.albacom.,这些只是示例。他正在根据它们在文档中的位置来搜索它们。
    • 您是如何从提供的描述中发现这一点的?
    • 请注意他的正则表达式如何包含大量 HTML。但他根本没有尝试描述 URL。那部分只是(.*)。特别有说服力的是bgcolor="#d3ebf8" 部分。这就是他如何识别包含他想要的信息的 HTML 部分。这是一种典型的屏幕抓取策略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多