2016-02-01 269 views
1

我想在python中使用re模塊來分割表示列表的字符串。該列表由括號標識。如何用正則表達式分割python中的括號列表?

輸入:

"[1]first[2]second[3]third" ... etc 

所需的輸出:

['first', 'second', 'third',...] 

我當前的代碼如下:

out = re.split('\[(.*?)\]', thelist) 

它返回以下,但如何獲得想要的?

['', '1', 'first', '2', "second", '3', 'third',...] 
+0

如果什麼列表元素包含'[數字]'? –

回答

2

您可以使用正則表達式匹配附帶[...]數字和擺脫空元素的搭配:

import re 
p = re.compile(r'\[\d+\]') 
test_str = "[1]first[2]second[3]third" 
print([x for x in p.split(test_str) if x]) 
# => ['first', 'second', 'third'] 

IDEONE demo

您的代碼返回因爲re.split返回所有捕獲的文本作爲結果數組中的獨立元素捕獲。

如果分隔符中存在捕獲組,並且它在字符串的開頭匹配,則結果將以空字符串開頭。

而且,要擺脫僅僅是第一個空的元素,你可以使用

res = p.split(test_str) 
if not res[0]: 
    del res[0] 
+0

如果列表中沒有括號並且看起來像這樣: 1.sdjdjdj2.sdjsdjjsd3.sdjdjds54.sdjsd 列表編號之前可以有數字嗎? – Shruf

+0

然後,我會使用['p = re.compile(r'\ d + \。')'](http://ideone.com/gUlB6e)。 –

+0

我試過了,但問題是它帶走了54.當它應該只是拿走了列表中的最後一個元素。 另一個例子1.kk2.y63。tt - > [kk,y6,tt]而不是[kk,y,tt] – Shruf

1

使用了[2:2]。這需要從第三個到最後每個條目,但只需要每隔一個條目。

1

如果格式總是相同的,你沒有在說話括號,然後使用的findall並得到串,每個閉合支架後:

s = "[1]first[2]second[3]third" 

import re 

print(re.findall("\](\w+)" ,s)) 
['first', 'second', 'third'] 

要處理的空間等。您可以使用字符集:

s = "[1]first foo[2]second[3]third" 

import re 

print(re.findall("\]([\w\s]+)", s)) 
['first foo', 'second', 'third'] 
1

您可以使用簡單的regex,如果你的字符串看起來您所描述的方法:

re.findall(r'[a-z]+', s) 

findall將返回給你一個列表,因此無需split

和輸出:

['first', 'second', 'third']