2010-09-17 326 views
11

我有这样分割单冒号而不是双冒号使用正则表达式

"yJdz:jkj8h:jkhd::hjkjh" 

我想用冒号作为分隔符分割一个字符串,而不是一个双冒号。期望的结果:

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

我想有:

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

,但我得到了一个错误的结果。

在我逃离"::"的同时,string.replace("::", "$$")

回答

21

你可以拆分(?<!:):(?!:)。这使用两个negative lookarounds(向后看和向前看),它声明有效匹配只有一个冒号,在它之前或之后没有冒号。

为了解释图案:

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

需要两个lookarounds,因为如果有仅回顾后,那么正则表达式引擎将在::匹配第一结肠(因为先前的字符不是冒号),如果只有前瞻,第二个冒号会匹配(因为下一个字符不是冒号)。

11

你可以用lookahead and lookbehind做到这一点,如果你想:

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

此正则表达式本质上说,“匹配:后面没有用一个:或之前有一个:

相关问题