2017-05-30 126 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

相關問題