2014-09-03 58 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)