Python 正则表达式错误:后视需要固定宽度的模式

Nay*_*ore 4 regex python-3.x

下面的正则表达式应该匹配任何:text:多数民众赞成由preceeded start-of-stringwhitespace或者:,和成功end-of-stringwhitespace:(连同一些额外的规则)

我不擅长正则表达式,但我在 regexr.com 中提出了所需的解决方案:

(?<=\s|:|^)(:[^\s|:]+:)(?=\s|:|$)
Run Code Online (Sandbox Code Playgroud)
:match1::match2: :match3:
:match4:
000:matchNot:
:matchNot:000
:match Not:
Run Code Online (Sandbox Code Playgroud)

结果::match1:, :match2:, :match3:,:match4:

但是在 Python 3 上,这会引发错误。

re.search("(?<=\s|:|^)(:[^\s|:]+:)(?=\s|:|$)", txt)
Run Code Online (Sandbox Code Playgroud)

re.error: 后视需要固定宽度的模式

任何人都知道解决此问题的好方法?任何提示表示赞赏。

anu*_*ava 6

在 python 中,您可以使用此解决方法来避免此错误:

(?:^|(?<=[\s:]))(:[^\s:]+:)(?=[\s:]|$)
Run Code Online (Sandbox Code Playgroud)

锚点^$无论如何都是零宽度匹配器。

正则表达式演示


Jan*_*Jan 5

可能最简单的解决方案是使用支持无限后视的较新regex模块

import regex as re

data = """:match1::match2: :match3:
:match4:
000:matchNot:
:matchNot:000
:match Not:"""

for match in re.finditer("(?<=\s|:|^)(:[^\s|:]+:)(?=\s|:|$)", data):
    print(match.group(0))
Run Code Online (Sandbox Code Playgroud)

这产生

:match1:
:match2:
:match3:
:match4:
Run Code Online (Sandbox Code Playgroud)