2010-09-17 16 views

Respuesta

21

Puede dividir en (?<!:):(?!:). Esto usa dos negative lookarounds (un lookbehind y un lookahead) que afirman que una coincidencia válida solo tiene dos puntos, sin dos puntos antes o después.

para explicar el patrón:

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

Se necesitan tanto lookarounds, porque si no había más que la búsqueda hacia atrás, entonces el motor de expresiones regulares sería coincide con los primeros dos puntos en :: (debido a que el carácter anterior no es una dos puntos), y si solo había un vistazo, el segundo punto coincidiría (porque el siguiente carácter no es dos puntos).

11

Usted puede hacer esto con lookahead and lookbehind, si quieres:

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

Esta expresión regular esencialmente dice "que coincida con un : que no vaya seguida de a : o precedido por : "

Cuestiones relacionadas