Разделить на одну двоеточие, но не на двоеточие с помощью регулярных выражений - PullRequest
12 голосов
/ 17 сентября 2010

У меня есть такая строка

"yJdz:jkj8h:jkhd::hjkjh"

Я хочу разделить его, используя двоеточие в качестве разделителя, но не двойное двоеточие. Желаемый результат:

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

Я пытаюсь с:

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

но я получил неправильный результат.

Тем временем я убегаю "::", с string.replace("::", "$$")

Ответы [ 2 ]

25 голосов
/ 17 сентября 2010

Вы можете разделить на (?<!:):(?!:). При этом используются два отрицательных обходных аргумента (просмотр сзади и прогнозирование), которые утверждают, что в допустимом совпадении есть только одно двоеточие, без двоеточия до или после него.

Чтобы объяснить шаблон:

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

Требуются оба обходных пути, потому что, если бы был только просмотр сзади, то механизм регулярных выражений соответствовал бы первому двоеточию в :: (потому что предыдущий символ не является двоеточием), и если бы был только просмотр, второе двоеточие будет соответствовать (потому что следующий символ не двоеточие).

11 голосов
/ 17 сентября 2010

Вы можете сделать это с lookahead и lookbehind , если хотите:

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

Это регулярное выражение по существу говорит "соответствует :, за которым не следует :или предшествует : "

...