正则表达式匹配,所有组由分隔符令牌分隔?

时间:2017-09-18 00:53:30

标签: python regex python-3.x

我有一种特殊的编码格式,我想要一个提取编码信息的正则表达式。我有':'作为一个特殊字符,分隔不同的“块”信息。例如:

s = 'P:1:a:3:test_data'

应该拆分为:

['P','1','a','3','test_data']

我可以使用:

s.split(':')

但是,我也可以编码一个':'(永远不会超过1':'组合在一起,所以没有歧义)。例如:

s = 'P:1:::3:test_data'

应该给:

['P','1',':','3','test_data']

使用split(':')会失败:

['P', '1', '', '', '3', 'test_data']

捕获':'的最佳方式是什么?我对正则表达式不是很强,我知道正则表达式组可以使用'* +'匹配至少一个字符,但我对如何将它们拼凑在一起非常困惑。更好的是,有没有正则表达式更好的方法呢?我想我总是可以迭代数组,检查连续的空字符串并将它们组合成':'。有更优雅的方式吗?

由于

1 个答案:

答案 0 :(得分:0)

对于您的特定情况,您可以使用负向环视来限制要在(?<!:):|:(?!:)上拆分的冒号,这是一个不在同一时间之前和之后的冒号:

import re
s = 'P:1:a:3:test_data'
s1 = 'P:1:::3:test_data'

re.split("(?<!:):|:(?!:)", s)
# ['P', '1', 'a', '3', 'test_data']

re.split("(?<!:):|:(?!:)", s1)
# ['P', '1', ':', '3', 'test_data']

另一个选项更通用,可以处理多个:re.findall(.+?)(?::|$)分组,即懒惰地匹配至少一个字符,直到找到冒号或到达结尾字符串:

re.findall('(.+?)(?::|$)', 'P:1:::3:test_data')
# ['P', '1', ':', '3', 'test_data']

re.findall('(.+?)(?::|$)', 'P:1:::::3:test_data')
# ['P', '1', ':', ':', '3', 'test_data']