2013-05-02 128 views
5

我想用':'和''字符分割一个字符串。但是,我想忽略两个空格''和两个冒号''。例如,Python使用正则表达式分割字符串

text = "s:11011 i:11010 ::110011 :110010 d:11000" 

应遵循的Python网站上的正则表达式HOWTO后分成

[s,11011,i,11010,:,110011, ,110010,d,11000] 

,我设法一起川方以下

regx= re.compile('([\s:]|[^\s\s]|[^::])') 
regx.split(text) 

然而,随着预期的,因为这不工作它分裂在:和空格上,但它仍然包含分割中的':'和''。

[s,:,11011, ,i,:,11010, ,:,:,110011, , :,110010, ,d,:,11000] 

我该如何解决这个问题?

编辑:在双重空间的情况下,我只想要一个空间出现

+1

如果你想避免双倍空间为什么在你提供的预期输出列表中有一个空格?你也只是在寻找一个正则表达式的答案吗? – jurgenreza 2013-05-02 05:35:30

+0

对不起,我的意思是说,如果有双重空间,我只想要一个空间出现。并且没有解决方案不必是正则表达式答案 – misterMan 2013-05-02 05:37:27

+0

此模式看起来像((\ s?)。(:)[0-1] +)*>>拆分组1和组2 – Civa 2013-05-02 05:50:16

回答

5

注意这是假定你的数据有格式像X:101010

>>> re.findall(r'(.+?):(.+?)\b ?',text) 
[('s', '11011'), ('i', '11010'), (':', '110011'), (' ', '110010'), ('d', '11000')] 

然后chain起来:

>>> list(itertools.chain(*_)) 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 
3
>>> text = "s:11011 i:11010 ::110011 :110010 d:11000" 
>>> [x for x in re.split(r":(:)?|\s(\s)?", text) if x] 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 
2

使用正则表达式(?<=\d) |:(?=\d)分裂:

>>> text = "s:11011 i:11010 ::110011 :110010 d:11000" 
>>> result = re.split(r"(?<=\d) |:(?=\d)", text) 
>>> result 
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000'] 

这将各执:

(?<=\d)的空间,当在左边的一个数字。要检查这个,我使用lookbehind assertion

:(?=\d)一个冒号,右边有一个数字。要检查这个,我使用lookahead assertion

0

看一看这种模式:

([a-z\:\s])\:(\d+) 

它会给你你期待在同一阵列。不需要使用分割,只需访问由正则表达式引擎返回的匹配。

希望它有帮助!