在Python中使用re.compile和正则表达式组

0 投票
1 回答
1018 浏览
提问于 2025-04-18 18:53

输入文件的名字叫做consensus,格式如下:

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))

有人能告诉我为什么我的正则表达式没有按我预期的方式解析吗?抱歉发了这么长的帖子,提前谢谢大家!

相关问题:

1 个回答

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的演示

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)

撰写回答