2017-03-09 87 views
1

我想按个别换行符或空格组拆分一个字符串。我得到了结果,除了''字符串。我如何消除这些?为什么我在这里得到空白字符串?

编辑:我需要输出保留空白组并分割每个换行符。唯一不需要的东西是''

In [208]: re.split('(\n|\ +)', 'many fancy word \n\n hello \t hi') 
Out[208]: 
['many', 
' ', 
'fancy', 
' ', 
'word', 
' ', 
'', 
'\n', 
'', 
'\n', 
'', 
' ', 
'hello', 
' ', 
'\t', 
' ', 
'hi'] 
+0

因为'()'是*捕获组*。使用'(?:\ n | \ +)'将其定义为*非捕获组*。 –

+0

@WillemVanOnsem对不起,我没有明确我的要求。请参阅更新。 – aitchnyu

+0

请参阅https://ideone.com/MB5TQ3,使用'[x for x in re.split('(\ n | +)','许多花哨的词\ n \ n hello \ t hi')if x]' –

回答

2

如果模式包括捕获组,那些分隔符将包含在结果列表中。

如果不使用捕获组或更换与非捕获组((?:...))捕获组((...)),分离器不包括在内。

# Not using group at all 
>>> re.split('\n|\ +', 'many fancy word \n\n hello \t hi') 
['many', 'fancy', 'word', '', '', '', 'hello', '\t', 'hi'] 


# Using non-capturing group 
>>> re.split('(?:\n|\ +)', 'many fancy word \n\n hello \t hi') 
['many', 'fancy', 'word', '', '', '', 'hello', '\t', 'hi'] 

报价re.split document

通过模式的出现将字符串分割。 如果在模式中使用捕获圆括号 ,则模式中所有组的文本均为 也作为结果列表的一部分返回。如果maxsplit不为零,则最多发生maxsplit分裂,并且字符串的其余部分为 ,作为列表的最后一个元素返回。


UPDATE根据问题编辑:

可以使用filter(None, ..)过滤空串出:

list(filter(None, re.split('(\n|\ +)', 'many fancy word \n\n hello \t hi'))) 

或使用re.findall改良模式:

+0

对不起,我没有明确我的要求。请参阅更新。 – aitchnyu

+0

@aitchnyu,'filter(None,re.split('(\ n | \ +)','很多花哨的词\ n \ n你好\'嗨'))'给你你想要的? (如果你使用python 3.x,用'list(..)'包装结果) – falsetru

+0

我认为你只需要在捕获组中包装空间匹配模式。 –

相关问题