如何在 Python 中使用 \K 进行正则表达式匹配?

9

\K 代表重置匹配的开始,当复杂的后顾条件不被支持时(即,不允许在后顾条件里使用 + 和 * ),它非常有用。它很好地满足了我的需求,但是当我尝试在Python中使用它时,它会报告 bad escape \K 错误。以下是我的Python代码:

re.sub(r'\[\n[ ]+\d+, ?\n[ ]+\K\d+(?=, ?\n[ ]+(?:true|false)\n[ ]+\])', '__table1.column__', content)

你可以使用一个捕获组 (\[\n[ ]+\d+, ?\n[ ]+)\d+(, ?\n[ ]+(?:true|false)\n[ ]+\]),并在替换中使用 \1__table1.column__\2。https://regex101.com/r/s0yvJr/1 - The fourth bird
@TheFourthBird 你应该省略掉 \2\K 的意思是“从这里开始匹配”。 - tripleee
@tripleee 我认为 OP 想要用 __table1.column__ 替换 2 个模式之间的数字。当使用 \K 时,它看起来像 https://regex101.com/r/vX8bIX/1 如果我省略 \2,则不会匹配原始模式中的前瞻逻辑。 - The fourth bird
1
啊,我的错,我没有注意到你是如何从前瞻匹配转换为普通匹配的。 - tripleee
你应该将这个发表为答案;你的比目前提出的两个答案都要好。 - tripleee
3个回答

8
您可以使用两个捕获组来实现这一点:
(\[\n[ ]+\d+, ?\n[ ]+)\d+(, ?\n[ ]+(?:true|false)\n[ ]+\])

Python示例|正则表达式示例

在替换中使用:

\1__table1.column__\2

例如
re.sub(
    r'(\[\n[ ]+\d+, ?\n[ ]+)\d+(, ?\n[ ]+(?:true|false)\n[ ]+\])',
    r'\1__table1.column__\2',
    content
)

2
谢谢!这对我来说完美地解决了问题。所以我猜在Python中没有直接支持\K的正则表达式? - Yu Gu
1
不是直接的方法,但你可以使用DeepSpace提供的正则表达式模块。 - The fourth bird

3
你可以使用支持它的 regex 模块。

所以,如果我使用这个正则表达式库,可以使用 \K。 - Just Me

0

您可以使用正向后瞻 (?<=...)

例如,您想读取 http div 后面的所有内容:

<label>Lorem Ipsum</label>

这个正则表达式 (?<=<label>).* 将返回:
Lorem Ipsum</label>

同时,如果你想要移除最后一个 div 部分的 </label>,你可以使用正向先行断言:(?=...),像这样:

(?<=<label>).*(?=</label>)

这将返回标签div的内容:
Lorem Ipsum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接