2014-09-03 25 views
3

我想使用python正則表達式分割使用方括號分隔的單詞/短語。我想分割輸出。條件是以方括號開頭和結尾的文本段將被拆分成不同的元素。使用python正則表達式使用方括號分隔的提取項

這是我迄今爲止,但它不能正常工作:

import re 
t="word1 word2 3456 [abc def] [ghi jkl] [1234] [-abcd] word 2345" 
re.split("(\[)(.*)(\])+",t) 

輸出:

['word1 word2 3456 ', 
'[', 
'abc def] [ghi jkl] [1234] [-abcd', 
']', 
' word [xyz 2345'] 

我所要的輸出是這樣的:

['word1 word2 3456 ', 
'[abc def]', 
' ', 
'[ghi jkl]', 
' ', 
'[1234]', 
' ', 
'[-abcd]', 
' word [xyz 2345'] 

注意只有同時具有開合方括號的物品纔會被拆分。第一和最後一個括號

['word1 word2 3456 ', '[abc def] [ghi jkl] [1234] [-abcd]', ' word [xyz 2345'] 
+0

你可能想're.findall'或're.finditer',不'重。 split'。 – 2014-09-03 16:31:03

回答

4

使用.+?而不是.*

>>> re.split("(\[.+?\])", t) 
['word1 word2 3456 ', '[abc def]', ' ', '[ghi jkl]', ' ', '[1234]', ' ', '[-abcd]', ' word 2345'] 
+0

沒錯!我忘了那個。split'保持捕獲組中的分離器。很好的答案+1 – 2014-09-03 16:35:07

+0

非常聰明的dav,我不知道這個+1 – 2014-09-03 16:58:23

+0

不知道用分離器!加上也:) – 2014-09-03 18:12:38

3

您可以使用此正則表達式來分割你的字符串

re.split("(\[.*\])+",t) 

但只有分裂:

\s(?=\[)|(?<=\])\s 

我也試過這個

Working demo

enter image description here

但由於它拆分那些空間就會消耗他們,你產生的結果應該是:

word1 word2 3456 
[abc def] 
[ghi jkl] 
[1234] 
[-abcd] word 2345 

所以,你可以使用上述正則表達式的解決方法,用自定義更換比賽像||| |||令牌生成類似:

word1 word2 3456||| |||[abc def]||| |||[ghi jkl]||| |||[1234]||| |||[-abcd]||| |||word 2345 

然後你可以使用split方法上的自定義標記|||,它會保持空間太爲:

'word1 word2 3456' 
' ' 
'[abc def]' 
' ' 
'[ghi jkl]' 
' ' 
'[1234]' 
' ' 
'[-abcd]' 
' ' 
'word ' 
+0

這不會是很正確的,因爲它會移除空格,但是它大概與're.split'一樣近。 – 2014-09-03 16:29:30

+0

@AdamSmith是的,您的答案是正確的。順便說一句,我已經更新了一個小解決方法的答案,以獲得OP輸出...它只是爲了提出一個想法 – 2014-09-03 16:42:51

+1

似乎他想要什麼,爲什麼不做一個[零寬度拆分](http://regex101.com/ R/dH6xL4/4)? '(?<=])|(?= \ [)'但是加上:) – 2014-09-03 16:47:05

0

試試這個:

re.findall(r"[^\]\[]*|\[[^\]\[]*?\]", t) 

這將返回

['word1 word2 3456 ', '', 'abc def', '', ' ', '', 'ghi jkl', '', ' ', '', '1234', '', ' ', '', '-abcd', '', ' word 2345', ''] 

刪除空字符串,這樣做:

list(filter(None, re.findall(r"[^\]\[]*|\[[^\]\[]*?\]", t))) 

返回

['word1 word2 3456 ', 
'abc def', 
' ', 
'ghi jkl', 
' ', 
'1234', 
' ', 
'-abcd', 
' word 2345'] 

要解釋的正則表達式:

re.compile(r""" 
    [^\]\[]*  # Zero or more characters that aren't [ or ] 
    |   # OR 
    \[   # a literal [ 
    [^\]\[]*? # Zero or more characters that aren't [ or ] 
    \]   # a literal ]""", re.X) 
相關問題