Python re.sub将字符串的部分更改为ascii test1=“222废话废话” newVal=“222” mstring=“()*”) newString=re.sub(mstring,rf“\1{newVal}\2”,test1) 印刷品(新闻字符串)

Python re.sub将字符串的部分更改为ascii test1=“222废话废话” newVal=“222” mstring=“()*”) newString=re.sub(mstring,rf“\1{newVal}\2”,test1) 印刷品(新闻字符串),python,regex,Python,Regex,我试图在我的字符串中找到一个特定的值,并使用re.sub函数替换为另一个字符串。似乎我找到了正确的匹配项并替换了它,但是python正在将字符串的一部分转换为它的ascii等价值。你能帮我完成上面的代码吗?这样我就能产生下面的输出了 test1 = "<test>222</test>blah blah blah" newVal = "222" mstring = "(<test>).*(</test>)" newString = re.sub(ms

我试图在我的字符串中找到一个特定的值,并使用re.sub函数替换为另一个字符串。似乎我找到了正确的匹配项并替换了它,但是python正在将字符串的一部分转换为它的ascii等价值。你能帮我完成上面的代码吗?这样我就能产生下面的输出了

test1 = "<test>222</test>blah blah blah"
newVal = "222"
mstring = "(<test>).*(</test>)"
newString = re.sub(mstring,rf"\1{newVal}\2",test1)
print(newString)
222废话废话
相反,我得到了低于结果的结果

<test>222</test>blah blah blah
r2废话废话

以下是一个可能的解决方案:

R2</test>blah blah blah

这种奇怪的行为是因为
\1{newVal}
(带
newVal=333
)将被解释为对组1333的引用。
\g
语法相当于
\1
,但在替换中并不含糊。

而不是
\1
\2
使用
\\1
\\2
@MarkRansom抱歉,它不适用于me@snakecharmerb我正在使用Python 3.7。我可以尝试升级到3.8并尝试again@MarkRansom它不能与你的方法一起工作。问题在于替换中的模糊性。有关详细信息,请参阅我的答案。@RiccardoBucco我的错误是,我没有看到字符串开头的
r
。我假设反斜杠正在被解释,而不是成为替换字符串的一部分me@Krishna我更新了答案,更详细地解释了你的方法(有时)失败的原因。谢谢你的解释。我最近才开始学习python,但这看起来是一个非常强大的功能
test1 = "<test>222</test>blah blah blah"
newVal = "111"
mstring = "(<test>).*(</test>)"
newString = re.sub(mstring, f'\g<1>{newVal}\g<2>', test1)`
print(newString) # <test>111</test>blah blah blah
newVal = "a"
re.sub(mstring, f'\1{newVal}\2', test1) # <test>a</test>blah blah blah