用Regex解析Python文件

2024-05-13 00:12:42 发布

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

我希望有人能让我走上正轨。我需要用Python解析nmap输出。我认为使用正则表达式是正确的方法,但我从未使用过regex。下面是我需要分析的文本示例-->;http://pastebin.com/QhG86D7D

我需要做的是:

  1. 我需要IP地址。在
  2. 我需要开放的港口。在

诀窍是我需要很明显地保持IP和端口绑定在一起,因为我将把它们导入一个数据库,这个数据库将显示每个IP的端口是打开的。在

我也在想我应该把逻辑写进一个函数中,这样我就可以用大量的主机来解析不同的文件。在

我知道如何将文件读入脚本并将数据放入数据库。我遇到的问题是使用正则表达式解析出我需要的数据。有人能帮我吗?在

提前谢谢!在


Tags: 文件数据方法端口文本gtipcom
2条回答

已经有一个Python模块用于解析Nmap扫描输出。对于python3,有python-nmap。对于python2,Nmap附带了一个名为Ndiff的工具,它是一个功能齐全的Nmap输出解析器库,带有一个生成diff的小驱动程序。在

这些模块都解析Nmap的XML输出(使用-oX选项生成)。这是最好的选择,因为正常的(人类可读的)输出会随着版本的变化而变化,而greable输出(您的示例)被弃用,这意味着它已经很长一段时间没有从任何新的Nmap版本提供输出:traceroute、NSE、端口状态原因、CPE对于软件和操作系统版本等等。在

以下方法可以帮助您开始:

import re

nmap = """Host: 127.0.0.1 ()      Status: Up
Host: 127.0.0.1 ()      Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 443/open/tcp//https///        Ignored State: closed (65532)
Host: 127.0.0.2 ()      Status: Up
Host: 127.0.0.2 ()      Ports: 21/open/tcp//ftp///, 22/open/tcp//ssh///, 25/open/tcp//smtp///, 53/filtered/tcp//domain///, 80/open/tcp//http///, 110/open/tcp//pop3///, 143/open/tcp//imap///, 443/open/tcp//https///, 465/filtered/tcp//smtps///, 993/open/tcp//imaps///, 995/open/tcp//pop3s///, 5222/filtered/tcp//xmpp-client///    Ignored State: closed (65523)
# Nmap done at Sat Nov  7 10:40:36 2015   2 IP addresses (2 hosts up) scanned in 32.07 seconds"""

entries = []

for line in nmap.split('\n'):
    re_host = re.match(r'Host\: ([0-9.]+?)\s+', line)
    if re_host:
        host = re_host.group(1)
        ports = re.findall('(\d+)\/open', line)

        if len(ports):
            entries.append((host,  ports))

for host, ports in entries:
    print '{:16} {}'.format(host, ports)

这将显示以下输出:

^{pr2}$

您需要用从文件中读取来替换split。在

相关问题 更多 >