使用正则表达式拆分单个冒号而不是双冒号

时间:2010-09-17 13:46:25

标签: python regex split

我有一个像这样的字符串

"yJdz:jkj8h:jkhd::hjkjh"

我想使用冒号作为分隔符将其拆分,但不是双冒号。期望的结果:

("yJdz", "jkj8h", "jkhd::hjkjh")

我正在尝试:

re.split(":{1}", "yJdz:jkj8h:jkhd::hjkjh")

但是我得到了错误的结果。

与此同时,我正在使用"::"

逃离string.replace("::", "$$")

2 个答案:

答案 0 :(得分:24)

你可以分开(?<!:):(?!:)。这使用两个negative lookarounds(一个lookbehind和一个前瞻),断言有效匹配只有一个冒号,在它之前或之后没有冒号。

解释模式:

(?<!:)  # assert that the previous character is not a colon
:       # match a literal : character
(?!:)   # assert that the next character is not a colon

需要两种外观,因为如果只有lookbehind,那么正则表达式引擎将匹配::中的第一个冒号(因为前一个字符不是冒号),如果只有前瞻,第二个冒号会匹配(因为下一个字符不是冒号)。

答案 1 :(得分:11)

如果您愿意,可以使用lookahead and lookbehind执行此操作:

>>> s = "yJdz:jkj8h:jkhd::hjkjh"
>>> l = re.split("(?<!:):(?!:)", s)
>>> print l
['yJdz', 'jkj8h', 'jkhd::hjkjh']

此正则表达式基本上表示“匹配:后面没有:或前面有: