re.findall 如何返回重复的匹配项
我有一个包含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地址。