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

Posted

技术标签:

【中文标题】使用正则表达式用单冒号而不是双冒号拆分【英文标题】:Split with single colon but not double colon using regex 【发布时间】:2011-04-13 17:53:17 【问题描述】:

我有一个这样的字符串

"yJdz:jkj8h:jkhd::hjkjh"

我想用冒号作为分隔符来分割它,而不是双冒号。期望的结果:

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

我正在尝试:

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

但我得到了错误的结果。

与此同时,我正在逃避"::",与string.replace("::", "$$")

【问题讨论】:

【参考方案1】:

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

解释模式:

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

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

【讨论】:

如何使用 POSIX RE(无环视)做到这一点?【参考方案2】:

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

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

这个正则表达式本质上是说“匹配一个:,它后面没有:或前面没有:

【讨论】:

以上是关于使用正则表达式用单冒号而不是双冒号拆分的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用引号和冒号分割

正则表达式 - 获取冒号后的数字

正则表达式在每个单词周围加上引号,后跟冒号

每 6 位使用正则表达式拆分字符串

正则表达式删去双引号vscode

需要正则表达式用单引号或双引号解析关键字='值'