在文本fi中查找模式的所有匹配项

2024-05-13 18:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的文本文件

Nmap scan report for 192.168.2.1
Host is up (0.023s latency).
PORT     STATE  SERVICE
5001/tcp closed commplex-link
MAC Address: EC:1A:59:A2:84:80 (Belkin International)

Nmap scan report for 192.168.2.2
Host is up (0.053s latency).
PORT     STATE  SERVICE
5001/tcp closed commplex-link
MAC Address: 94:35:0A:F0:47:C2 (Samsung Electronics Co.)

Nmap scan report for 192.168.2.3  
Host is up (0.18s latency).  
PORT     STATE    SERVICE  
5001/tcp filtered commplex-link  
MAC Address: 00:13:CE:C0:E5:F3 (Intel Corporate)  

Nmap scan report for 192.168.2.6
Host is up (0.062s latency).
PORT     STATE  SERVICE
5001/tcp closed commplex-link
MAC Address: 90:21:55:7D:53:4F (HTC)

我想找到端口5001关闭(未过滤)的所有IP。我试着用下面的逻辑找到所有这些IP

^{pr2}$

我希望输出是

192.168.2.1

192.168.2.2

192.168.2.6

但是我没有得到想要的输出。输出只是一个项目,如下所示:

('192.168.2.1', '\nHost is up (0.023s latency).\nPORT STATE SERVICE\n5001/tcp closed commplex-link\nMAC Address: EC:1A:59:A2:84:80 (Belkin International)\n\nNmap scan report for 192.168.2.2\nHost is up (0.053s latency).\nPORT STATE SERVICE\n5001/tcp closed commplex-link\nMAC Address: 94:35:0A:F0:47:C2 (Samsung Electronics Co.)\n\nNmap scan report for 192.168.2.3\nHost is up (0.18s latency).\nPORT STATE SERVICE\n5001/tcp filtered commplex-link\nMAC Address: 00:13:CE:C0:E5:F3 (Intel Corporate)\n\nNmap scan report for 192.168.2.6\nHost is up (0.062s latency).\nPORT STATE SERVICE\n5001/tcp )

我哪里出错了?在

解决方案: 下面的逻辑对我有用。如果有人有更好的答案,请告诉我。在

^{3}$

Tags: reporthostforscanisaddressservicelink
3条回答

您可以:

>>> re.findall(r'^Nmap.*?(\d+\.\d+\.\d+\.\d+).*?5001\/tcp closed', fp, re.M)
# ['192.168.2.1', '192.168.2.2', '192.168.2.6']

这里不需要^{}s修饰符将点元字符(.)的含义从“匹配所有内容换行符”改为“匹配所有内容包括换行字符”。你不需要这个。在

第二个捕获组也不需要。您只需删除它就可以只返回IP:

>>> matched = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*closed', fp)
>>> matched
['192.168.2.1', '192.168.2.2', '192.168.2.6']

由于行格式似乎总是相同的(ip从偏移量21开始,在下一个空格处结束),您可以在不使用regex的情况下尝试另一种方法:

for block in data.split("\n\n"):
    if block.find('5001/tcp closed')>0:
        print block[21:block.find('\n', 27)]

相关问题 更多 >