将lookbehind模式与匹配的正则表达式搜索模式分组以作为整体替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将lookbehind模式与匹配的正则表达式搜索模式分组以作为整体替换相关的知识,希望对你有一定的参考价值。

我必须搜索并替换具有以下条件的模式:如果在一行中找到字符串“y = 2”,并且如果它前面或前面没有“x =”,那么替换,匹配的字符串“y = 2 “with”x = 1 y = 2“。我正在尝试以下内容

line="hello x=7 y=2"
m = re.search(r"((?<=x=ds)|(?<!x=ds))y=2", line)
if m:
    s = "x=1 " + m.group(0)
    line = re.sub(m.group(0), s, line)
    print line

我输出为hello x = 7 x = 1 y = 2,这与我预期的输出不同:hello x = 1 y = 2

如何将包含lookbehind表达式的整个模式作为匹配的字符串?这将解决我的问题。

m.group(0) always print y=1, and m.group(1) prints nothing

我希望这具有整个字符串“x = 7 y = 1”以使替换正常工作

答案

我不认为你需要lookbehind模式来做到这一点。所有的工作是将y=2x=d y=2替换为x=1 y=2,对吗?

line="hello x=7 y=2"
re.sub(r'(x=ds)?y=2', 'x=1 y=2', line) 
另一答案

所以,基本上,如果一行有y=2替换或前置x=定义?如果是这样,我建议你改变算法来做到这一点:

  1. 如果搜索y=2为真,那么
  2. 如果搜索x=[0-9]为真,则替换为x=1;
  3. 否则,用y=2替换x=1 y=2(为了优化,您可以存储和使用y=2的初始搜索结果。)

以上是关于将lookbehind模式与匹配的正则表达式搜索模式分组以作为整体替换的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式学习笔记

VSCode内部正则表达式搜索具有负面的lookbehind

PHP 正则表达式(PCRE)

雷林鹏分享:PHP 正则表达式(PCRE)

如何使用带有线锚的 C# 正则表达式 Lookbehind

ES2018 新特征之:正则表达式反向(lookbehind)断言