如何在Python中使用匹配的组和变量进行子化

Sye*_*d H 12 python regex

新的python.这可能很简单,但我没有找到答案.

rndStr = "20101215"
rndStr2 = "20101216"
str = "Looking at dates between 20110316 and 20110317"
outstr = re.sub("(.+)([0-9]{8})(.+)([0-9]{8})",r'\1'+rndStr+r'\2'+rndStr2,str)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的输出是:

Looking at dates between 20101215 and 20101216
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

P101215101216
Run Code Online (Sandbox Code Playgroud)

两个rndStr的值并不重要.假设它是随机的或取自用户输入(我在这里放置静态val以保持简单).谢谢你的帮助.

Mar*_*son 24

你的反馈是不明确的.您的替换字符串变为

\120101215\220101216
Run Code Online (Sandbox Code Playgroud)

这是两个相当大的数字反向引用:)

要解决它,请使用以下语法:

r'\g<1>'+rndStr+r'\g<2>'+rndStr2 
Run Code Online (Sandbox Code Playgroud)

你也有太多的括号(如果你像我一样说英国英语,则为"括号") - 你不需要围绕[0-9]{8}你没有反向引用的部分的括号:

re.sub("(.+)[0-9]{8}(.+)[0-9]{8}",...
Run Code Online (Sandbox Code Playgroud)

应该足够了.

(而且,正如其他地方所述,不要str用作变量名.除非你想花费多年时间调试为什么str.replace()不再工作.不是说我曾经做过一次...... noooo.:)

所以整个事情变成了:

import re
rndStr = "20101215"
rndStr2 = "20101216"
s = "Looking at dates between 20110316 and 20110317"
outstr = re.sub("(.+)[0-9]{8}(.+)[0-9]{8}", r'\g<1>'+rndStr+r'\g<2>'+rndStr2, s) 
print outstr
Run Code Online (Sandbox Code Playgroud)

生产:

Looking at dates between 20101215 and 20101216
Run Code Online (Sandbox Code Playgroud)