5

我想用 ':' 和 ' ' 字符分割一个字符串。但是,我想忽略两个空格“”和两个冒号“::”。例如

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

应该分成

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

在遵循 python 网站上的正则表达式 HOWTO 之后,我设法想出了以下内容

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

然而,这并没有按预期工作,因为它在 : 和空格上拆分,但它仍然在拆分中包含 ':' 和 ' '。

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

我怎样才能解决这个问题?

编辑:如果是双倍空格,我只希望出现一个空格

4

4 回答 4

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']
于 2013-05-02T05:42:27.317 回答
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']
于 2013-05-02T05:49:52.750 回答
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)一个冒号,当右边有一个数字时。为了检查这一点,我使用了前瞻断言

于 2013-05-02T06:16:10.823 回答
0

看看这个模式:

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

它将为您提供您期望的相同数组。无需使用拆分,只需访问正则表达式引擎返回的匹配项即可。

希望能帮助到你!

于 2013-05-02T07:01:47.547 回答