不确定这个问题是否存在,但无论如何我都会试一试。 基本上我需要的是解析一个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"例如。
我觉得这是一个好的开始,但我没有看到如何从那里继续。我对正则表达式并不擅长,我觉得我需要的实际上是正则表达式...所以我有点卡在这里。
有人能让我在正确的轨道上解决这个问题吗?
答案 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系统造成任何伤害。