Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找文本文件中出现的所有图案_Python_Regex - Fatal编程技术网

Python 查找文本文件中出现的所有图案

Python 查找文本文件中出现的所有图案,python,regex,Python,Regex,我有一个文本文件,看起来像这样 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). P

我有一个文本文件,看起来像这样

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

fp = open('nmap_op.txt').read()
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*)closed',re.S)
matched = ip.findall(fp)
for item in matched:
  print item
我希望输出是

192.168.2.1

192.168.2.2

192.168.2.6

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

('192.168.2.1','\n主机启动(0.023s延迟)。\n端口状态服务\n5001/tcp闭合通信链路\n MAC地址:EC:1A:59:A2:84:80(贝尔金国际)\n\n192.168.2.2的地图扫描报告\n主机启动(0.053s延迟)。\n端口状态服务\n5001/tcp闭合通信链路\n MAC地址:94:35:0A:F0:47:C2(三星电子公司)\n\n192.168.2.3的映射扫描报告\n主机启动(0.18秒延迟)。\n端口状态服务\n5001/tcp过滤的commplex链接\nMAC地址:00:13:CE:C0:E5:F3(英特尔公司)\n\n192.168.2.6的映射扫描报告\n主机启动(0.062s延迟)。\n端口状态服务\n5001/tcp)

我哪里做错了

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

fp = open('nmap_op.txt').read()
entries = re.split('\n\n',fp)  
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?closed',re.S)
matched = []
for item in entries:
  if ip.search(item):
    matched.append(ip.search(item).group(1))
你不需要在这里。
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']
你不需要在这里。
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']
你可以做:

>>> 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']
你可以做:

>>> 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']

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

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

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

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

解决方案:以下逻辑对我有效

fp = open('nmap_op.txt').read()
entries = re.split('\n\n',fp)  
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?closed',re.S)
matched = []
for item in entries:
  if ip.search(item):
    matched.append(ip.search(item).group(1))

解决方案:以下逻辑对我有效

fp = open('nmap_op.txt').read()
entries = re.split('\n\n',fp)  
ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?closed',re.S)
matched = []
for item in entries:
  if ip.search(item):
    matched.append(ip.search(item).group(1))

+1表示包含的相关代码、预期输出和实际输出+1表示包含的相关代码、预期输出和实际输出回答Amal。实际上,IP地址和5001/tcp闭合在不同的线路上。我注意到我没有给出正确的文本文件格式。很抱歉。我使用了一个新的模式ip=re.compile(“([0-9]+\[0-9]+\[0-9]+\[0-9]+\[0-9]+.*?closed',re.S),我得到的输出是['192.168.2.1','192.168.2.2','192.168.2.3',最后一个条目是不正确的,我想你也明白为什么。我快到了。我只需要一个模式,它将忽略IP,如果它认为一个模式是“过滤”之间。你能帮我吗?谢谢你的回答。实际上,IP地址和5001/tcp闭合在不同的线路上。我注意到我没有给出正确的文本文件格式。很抱歉。我使用了一个新的模式ip=re.compile(“([0-9]+\[0-9]+\[0-9]+\[0-9]+\[0-9]+.*?closed',re.S),我得到的输出是['192.168.2.1','192.168.2.2','192.168.2.3',最后一个条目是不正确的,我想你也明白为什么。我快到了。我只需要一个模式,它将忽略IP,如果它认为一个模式是“过滤”之间。你能帮我吗?嘿,卡西米尔。谢谢你的回答。实际上,IP地址和5001/tcp闭合在不同的线路上。我注意到我没有给出正确的文本文件格式。很抱歉。我已经更正了文本文件格式。不过我喜欢你的想法。我在这方面的想法是well@Sanket:我明白了,这没关系,我相信有一种比在特定情况下使用正则表达式更有效的方法,因为您的数据格式清晰(或者至少是更简单的模式)Hey Casimir。谢谢你的回答。实际上,IP地址和5001/tcp闭合在不同的线路上。我注意到我没有给出正确的文本文件格式。很抱歉。我已经更正了文本文件格式。不过我喜欢你的想法。我在这方面的想法是well@Sanket:我明白了,这没关系,我相信有一种比在特定情况下使用正则表达式更有效的方法,因为您的数据格式清晰(或者至少是更简单的模式)