将后视模式与匹配的正则表达式搜索模式一起分组以作为一个整体进行替换

Grouping lookbehind pattern along with matching regex search pattern to substitute as a whole

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

line="hello x=7 y=2"
m = re.search(r"((?<=x=\d\s)|(?<!x=\d\s))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" 以使替换正常工作

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

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

我认为您不需要后视模式来执行此操作。所有的工作就是将y=2x=\d y=2替换为x=1 y=2,对吧?

line="hello x=7 y=2"
re.sub(r'(x=\d\s)?y=2', 'x=1 y=2', line)