re.findall 如何返回重复的匹配项

2 投票
2 回答
562 浏览
提问于 2025-04-16 19:16

我有一个包含IP和端口的列表,这些信息是在HTML中。当我使用findall来查找所有的IP时,我得到了所有的IP列表,因为每个IP都是唯一的。不过,有些端口是重复的,所以我可能会得到100个IP,但只有87个端口。请问如何找到所有的端口,包括那些重复的?

proxies = re.findall("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",html)

ports = re.findall("[0-9]{1,3}\,[0-9]{1,3}\,[0-9]{1,3}\,[0-9]{1,3}",html)
#ports are coded to looks like this 47,46,47,46

print len(proxies)
print len(ports)

2 个回答

0

不确定这对你有没有太大帮助,不过这是另一个选择:

txt = """
<tr>
    <td class="t_ip">151.9.233.6</td>
    <td class="t_port">50,42</td>
    <td class="t_country"><img src="/images/flags/it.png" alt="it" />Italy</td>
    <td class="t_anonymity">

            High

    </td>
    <td class="t_https">-</td>
    <td class="t_checked">00:02:16</td>
    <td class="t_check">
        <a href="" class="a_check" >check</a>
    </td>
</tr>    
"""

txt = [line.strip() for line in txt.split('\n')]

#clstaglen = len('</td>') => 5
getVals = lambda startTxt: [line[len(startTxt):len(line)-5] for line in txt if line.startswith(startTxt)]

print getVals('<td class="t_ip">')
print getVals('<td class="t_port">')
2

在没有看到源文件的情况下,我只能说一些基本的观点。

  • 端口号并不是只有三位数,所以你排除了999以上的端口。
  • 端口号是不是只显示为四个端口的列表?你说格式是IP:PORT的列表,但你并没有检查这个。

编辑:

仔细看看页面的源代码。有些条目并没有四个端口号。

<tr>
    <td class="t_ip">151.9.233.6</td>
    <td class="t_port">50,42</td>
    <td class="t_country"><img src="/images/flags/it.png" alt="it" />Italy</td>
    <td class="t_anonymity">

            High

    </td>
    <td class="t_https">-</td>
    <td class="t_checked">00:02:16</td>
    <td class="t_check">
        <a href="" class="a_check" >check</a>
    </td>
</tr>

看起来检查class="t_ip"class="t_port"会简单很多,这样可以直接获取这些元素的内容。

<td class="t_ip">(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})</td>
<td class="t_port">((\d,?)+)</td>

注意:这个IP地址的表达式可能会匹配到无效的IP地址。

撰写回答