使用正则表达式用单冒号而不是双冒号拆分
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']
这个正则表达式本质上是说“匹配一个:
,它后面没有:
或前面没有:
”
【讨论】:
以上是关于使用正则表达式用单冒号而不是双冒号拆分的主要内容,如果未能解决你的问题,请参考以下文章