2014-08-28 32 views
0

輸入文件,命名爲共識,是下面的形式:使用re.compile和團體的正則表達式在Python

r Tor4ever AAcif1htILdru0BO0qX7OwGVhAU oHlbWBdaN3+QSleqBVL9/yAdcRs 2014-07-31 21:42:43 
s Exit Fast Guard HSDir Running V2Dir Valid 
v Tor 0.2.4.21 
w Bandwidth=231 
p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999 
r Tornin AA8YrCza5McQugiY3J4h5y4BF9g vNRd1kyQ0i9UsVwYq5YFPHJi3jw 2014-08-01 00:26:18 
s Fast Guard HSDir Named Running Stable V2Dir Valid 
v Tor 0.2.4.23 
w Bandwidth=713 
p reject 1-65535 

我想解析出域名(第r行的開始) ,保護標記(在S線)和帶寬(在W線)得到類似如下:

{ {"nickname" : "Tor4ever", "type" : "Guard", "bandwidth" : "231"}, 
{"nickname" : "Tornin", "type" : "Guard", "bandwidth" : "713"} } 

我無法制定正確的正則表達式。下面是我使用的代碼的相關部分:

consensus = file(sys.argv[1]).read() 

regex = re.compile('''^r\s(.*?)\s.*?\ns\s.*?(Guard)\s.*?\nw\s.*?([0-9]+)\n''', 
re.MULTILINE) 

for record in regex.finditer(consensus): 
    relay = { 
    'nickname' : record.group(1), 
    'type' : record.group(2), 
    'bandwidth' : record.group(3), 
    } 

    relays['relays'].append(relay) 

open('tor_relays.txt','w').write(json.dumps(relays, indent=4)) 

誰能告訴我爲什麼我的正則表達式解析不是我預料到的方式嗎? 對不起,很長的文章,並提前致謝!

+0

你忘了佔'v托爾...'行了'(後衛)'部分之後。 – OnlineCop 2014-08-28 18:40:38

回答

1

嘗試

^r\s(?P<nickname>\b\S+\b).*\n^s\b.*?(?P<type>\bGuard\b).*\n^v.*\n^w\s.*?(?P<bandwidth>\b[0-9]+\b) 

這可能是一個小更詳細的比你需要的,但它使一個小更易於閱讀。 Regex101 demo

import re 
p = re.compile(ur'^r\s(?P<nickname>\b\S+\b).*\n^s\b.*?(?P<type>\bGuard\b).*\n^v.*\n^w\s.*?(?P<bandwidth>\b[0-9]+\b)', re.MULTILINE | re.VERBOSE) 
test_str = u"r Tor4ever AAcif1htILdru0BO0qX7OwGVhAU oHlbWBdaN3+QSleqBVL9/yAdcRs 2014-07-31 21:42:43 \ns Exit Fast Guard HSDir Running V2Dir Valid \nv Tor 0.2.4.21 \nw Bandwidth=231 \np reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999 \nr Tornin AA8YrCza5McQugiY3J4h5y4BF9g vNRd1kyQ0i9UsVwYq5YFPHJi3jw 2014-08-01 00:26:18 \ns Fast Guard HSDir Named Running Stable V2Dir Valid \nv Tor 0.2.4.23 \nw Bandwidth=713 \np reject 1-65535" 

re.findall(p, test_str) 
+0

這工作的一種享受。非常感謝。補充工具欄:你知道爲什麼我的正則表達式不起作用嗎?再次感謝! – jaydh 2014-08-28 18:52:03

+0

看到我對OP的評論:你已經忘記了'v Tor ...'這一行。 – OnlineCop 2014-08-28 19:01:47