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

Rug*_*rra 13 python regex split

我有这样的字符串

"yJdz:jkj8h:jkhd::hjkjh"
Run Code Online (Sandbox Code Playgroud)

我想用冒号作为分隔符拆分它,但不是双冒号.期望的结果:

("yJdz", "jkj8h", "jkhd::hjkjh")
Run Code Online (Sandbox Code Playgroud)

我正在尝试:

re.split(":{1}", "yJdz:jkj8h:jkhd::hjkjh")
Run Code Online (Sandbox Code Playgroud)

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

在此期间,我逃避"::",用string.replace("::", "$$")

Dan*_*uis 27

你可以拆分(?<!:):(?!:).这使用两个负面的外观(lookbehind和lookahead),它断言有效匹配只有一个冒号,在它之前或之后没有冒号.

解释模式:

(?<!:)  # assert that the previous character is not a colon
:       # match a literal : character
(?!:)   # assert that the next character is not a colon
Run Code Online (Sandbox Code Playgroud)

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


eld*_*his 11

如果你愿意,你可以用lookahead和lookbehind来做到这一点:

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

这个正则表达式基本上是说"匹配a :后面没有a :或者前面跟a :"