2017-05-30 127 views
0

我一直在尝试各种事情的大部分时间都在敲我的初学者脑袋。如何使用正则表达式分割多行字符串?

这里是字符串

1 default       active Eth2/45, Eth2/46, Eth2/47 
               Eth3/41, Eth3/42, Eth3/43 
               Eth4/41, Eth4/42, Eth4/43 
47 Production       active Po1, Po21, Po23, Po25, Po101 
               Po102, Eth2/1, Eth2/2, Eth2/3 
               Eth2/4, Eth3/29, Eth3/30 
               Eth3/31, Eth3/32, Eth3/33 
               Eth3/34, Eth3/35, Eth3/36 
               Eth3/37, Eth3/38, Eth3/39 
               Eth3/40, Eth3/44, Eth4/29 
               Eth4/30, Eth4/31, Eth4/32 
               Eth4/33, Eth4/34, Eth4/35 
               Eth4/36, Eth4/37, Eth4/38 
               Eth4/39, Eth4/40, Eth4/44 
128 Test    active Po1, Eth1/13, Eth2/1, Eth2/2 
               Eth2/3, Eth2/4 
129 Backup    active Po1, Eth1/14, Eth2/1, Eth2/2 
               Eth2/3, Eth2/4 

我需要的是分裂像下面。我试图用regex101.com来模拟各种正则表达式,但我没有太多的运气。我设法用(\n\d+)来隔离分隔符,然后我想使用lookbehind,但是我得到一个错误,说我需要固定的字符串长度。
这里是对regex101 section链接:

1 default       active Eth2/45, Eth2/46, Eth2/47 
               Eth3/41, Eth3/42, Eth3/43 
               Eth4/41, Eth4/42, Eth4/43 

47 VLAN047       active Po1, Po21, Po23, Po25, Po101 
               Po102, Eth2/1, Eth2/2, Eth2/3 
               Eth2/4, Eth3/29, Eth3/30 
               Eth3/31, Eth3/32, Eth3/33 
               Eth3/34, Eth3/35, Eth3/36 
               Eth3/37, Eth3/38, Eth3/39 
               Eth3/40, Eth3/44, Eth4/29 
               Eth4/30, Eth4/31, Eth4/32 
               Eth4/33, Eth4/34, Eth4/35 
               Eth4/36, Eth4/37, Eth4/38 
               Eth4/39, Eth4/40, Eth4/44 

128 Rogers-Refresh-MGT    active Po1, Eth1/13, Eth2/1, Eth2/2 
               Eth2/3, Eth2/4 

129 ManagementSegtNorthW    active Po1, Eth1/14, Eth2/1, Eth2/2 
               Eth2/3, Eth2/4 

更新:我更新the regex101 example但它不选择我想要的。 Python代码的作品。我不知道什么是问题regex101

回答

2

这很简单 - 用超前的,而不是回顾后:

parsed = re.split(r'\n(?=\d)', data) 
+0

这是一种Pythonic的做法!谢谢! – MiniMe

+0

您能否对此更新发表评论? – MiniMe

+0

regex101显示匹配,而不是分割 - 但它确实显示了如果要执行're.split()',字符串将分割的位置。 – zwer

2

在python中总是有不止一种方法来皮肤猫。多线正则表达式通常非常困难。以下是简单了很多,更重要的是可读

for line in data.split("\n"): 
    if line[0].isdigit(): 
     if section: 
      sections.append("\n".join(section)) 
      section=[] 
     section.append(line) 

sections.append("\n".join(section)) # grab the last one 

print(sections) 

在性能方面,我认为这可能会更好,因为我们不是在寻找整个字符串的模式。我们只查看一行中的第一个字符。

+0

你错过了整个'else'情况下,当第一个字符不是一个数字,但即使与修复正则表达式仍然将执行更快CPython(不是很多,tho) - 并不是因为获取过程,而是因为一旦编译完成,所有事情都在'C'端执行。在我的系统中,'regex'比Python 2.7中的过程方法(修复后)快了约15%,而Python 3.5中只有几个百分点。 – zwer

+0

有趣@zwer我认为这会更快。看起来你是对的。你的好答复+1 – e4c5

相关问题