2015-08-17 123 views
1

不確定這個問題是否有它的位置,但無論如何我會給它一個鏡頭。 基本上我需要的是解析一個conf文件。使用python解析dns配置文件

它應該是這樣的:

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」關於第二線 「IN」之後是什麼:可以是MX,A和其他一些。 IP:在這種情況下是192.168.60.1,但這可能是其他任何東西。

我不一定需要完整的腳本。地獄我甚至不需要一個,這不是我在這裏發佈的目標。 我想知道這種情況下的最佳方法。 大部分我傾向於擺脫這樣的情況的時候,而這個時候,這似乎有點棘手,因爲:

  • 我不能立足自己上線的大小。

  • 我不能立足自己的「點」 (.)的地址,一個可以有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

爲什麼不只是'。* \ s + IN \ s +(?: A | MX | ...)\ s +(。*?)「\ s * $'? – Kevin

+0

https://pypi.python .org/pypi/iscpy? – wenzul

回答

1

這忽略以#開頭開始,解碼行線的本地數據:「,並解析出主機名,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系統造成任何傷害。

+0

經過大量測試,這似乎是我正在尋找的,我剛剛添加'[#]?' 謝謝! – Enjoyted

+0

:-)我不認爲你需要[]圍繞# - 只是#?應該工作 – barny

+0

是真的。對正則表達式仍然很陌生。不過謝謝 – Enjoyted