Python使用正则表达式分割字符串

5
我希望将一个字符串按照冒号和空格进行分割。但是,我想忽略两个空格' '和两个双冒号'::'。例如:
text = "s:11011 i:11010 ::110011  :110010 d:11000"

应该分割成

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

在阅读了Python官方网站上的正则表达式指南后,我成功地创建了以下内容:

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

然而,这种方法并未如预期般起作用,因为它在“:”和空格处进行分割,但仍然在分割中包含“:”和“ ”。
[s,:,11011, ,i,:,11010, ,:,:,110011, , :,110010, ,d,:,11000]

我该如何修复这个问题?
编辑:如果存在双空格,我只希望出现一个空格。

1
如果你想避免双空格,为什么在你提供的预期输出列表中有一个空格?此外,你只是寻找正则表达式的答案吗? - jurgenreza
抱歉,我的意思是在出现双空格的情况下,我只想要一个空格。解决方案不一定要使用正则表达式。 - misterMan
这个模式看起来像是 ((\s?).(:)[0-1]+)* ---> 分割组 1 和组 2。 - Civa
4个回答

5
请注意,这假定您的数据格式如下:X:101010
>>> re.findall(r'(.+?):(.+?)\b ?',text)
[('s', '11011'), ('i', '11010'), (':', '110011'), (' ', '110010'), ('d', '11000')]

然后将它们在一起:
>>> 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) 在左侧有数字时,会在空格处拆分。为了检查这一点,我使用了后顾断言。 - :(?=\d) 在右侧有数字时,会在冒号处拆分。为了检查这一点,我使用了先顾断言

0

看一下这个模式:

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

它将给你期望的相同数组。无需使用split,只需访问正则表达式引擎返回的匹配项。

希望能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接