使用python

时间:2015-08-17 13:40:50

标签: python python-2.7 parsing

不确定这个问题是否存在,但无论如何我都会试一试。 基本上我需要的是解析一个conf文件。

看起来像这样:

 1. #local-data: "some.dns.url IN MX 192.168.80.45"
 2. local-data: "some.other.dns.url IN A 192.168.60.1"
 3. local-data: "router.home.somewhere IN A 192.168.20.1"
 4. *a linebreak*
 5. local-data-ptr: "192.168.80.45 some.dns.url"
 6. local-data-ptr: "192.168.60.1 some.other.dns.url"
 7. # some other random comment
 8. local-data-ptr: "192.168.20.1 router.home.somewhere"

我需要摆脱它的是: 地址:" some.other.dns.url"在 2 nd行 什么是" IN" :可以是MX,A,其他一些。 IP:在这种情况下为192.168.60.1,但这可能是其他任何内容。

我不一定需要完整的脚本。地狱我甚至不需要一个,这不是我在这里发布的目标。 我想知道这种情况的最佳方法。 大多数时候我倾向于摆脱这种情况,但这次看起来有点棘手:

  • 我不能以自己的线条大小为基础。

  • 我不能立足于#34; dot" (.)代表地址,因为一个可以有2个点,另一个有3个。

  • 我有一部分行("IN")只是令人不安而且没有用处。

到目前为止我做了什么:

dnsconf = open('theconffile.conf', 'r')
dnsconf = dnsconf.readlines()
x = []
    for line in dnsconf:
        cont = re.findall('\"(.+?)\"', line)
        if len(line) > 1 and line[:1] is not '#':
           x.append(cont)
           print cont

cont基本上包含双引号内的内容。 " some.dns.url IN MX 192.168.80.45"例如。

我觉得这是一个好的开始,但我没有看到如何从那里继续。我对正则表达式并不擅长,我觉得我需要的实际上是正则表达式...所以我有点卡在这里。

有人能让我在正确的轨道上解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这会忽略以#开头的行,解码以'local-data:'开头的行,并将主机名,DNS类型和IP地址解析为列表:

import re

dnsconf = open('dns.txt', 'rt')

x = []
for line in dnsconf:
    cont = re.findall('^local-data:\s+\"(\S+)\s+IN\s+(\S+)\s+(\S+)\"', line)
    if cont:
        x.append(cont)
        print cont

这允许使用\ s +。

在字符串中重复空格

您的数据输出为:

[('some.other.dns.url', 'A', '192.168.60.1')]
[('router.home.somewhere', 'A', '192.168.20.1')]

注意除非你有理由需要内存中的所有文本,否则不需要使用readlines()。同样对于Windows健壮性,使用文件打开模式“rt”不会对unixy系统造成任何伤害。