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

如何在Python中使用匹配的组和变量进行sub,python,regex,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) 我想要的输出是: Looking at dates between 20101215 and 2

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)
我想要的输出是:

Looking at dates between 20101215 and 20101216
但我得到的却是:

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

rndStr = "20101215"
rndStr2 = "20101216"
mys = "Looking at dates between {0} and {1}".format(rndStr, rndStr2)

请不要使用
str
作为变量名;它会覆盖内置的
str
类型。

您的反向引用不明确。替换字符串变为

\120101215\220101216
这是两个需要反向引用的相当大的数字:)

要解决此问题,请使用以下语法:

r'\g<1>'+rndStr+r'\g<2>'+rndStr2 
应该足够了

(并且,正如其他地方所指出的,不要使用
str
作为变量名。除非您想花很长时间调试为什么
str.replace()
不再起作用。这并不是说我曾经这样做过一次……没问题。)

所以整个事情变成了:

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

请注意,如果您将
rndStr
rndStr2
的值更改为文本(如“abc”)而不是数字,您会得到更接近预期结果的结果吗

re.sub
的表达式中,您有
r'\1'+rndStr+…
这将组合成
'\1'+'20101215'
,然后尝试引用
\120101215
的反向引用,这可能不是您想要的

您可以使用命名的反向引用来明确反向引用:

rep1 = "20101215"
rep2 = "20101216"
st = "Looking at dates between 20110316 and 20110317"

print re.sub(r'(?P<fp>.+)[0-9]{8}(?P<lp>.+)[0-9]{8}',
            r'\g<fp>'+rep1+r'\g<lp>'+rep2,st)
rep1=“20101215”
rep2=“20101216”
st=“查看20110316和20110317之间的日期”
打印re.sub(r'(?P.+)[0-9]{8}(?P.+)[0-9]{8}',
r'\g'+rep1+r'\g'+rep2,st)
更好的是,使用更容易理解的语法并检查尝试匹配的返回:

m=re.search(r'(?P<fp>.+)[0-9]{8}(?P<lp>.+)[0-9]{8}',st)
if m:
    print m.group('fp')+rep1+m.group('lp')+rep2  #you could use m.group(1) too
else:
    print "no match..."
m=re.search(r'(?P.+)[0-9]{8}(?P.+)[0-9]{8}',st)
如果m:
打印m.group('fp')+rep1+m.group('lp')+rep2#您也可以使用m.group(1)
其他:
打印“不匹配…”
在这两种情况下,您所需的
字符串将查看20101215和20101216之间的日期
已生成

命名反向引用上的Python文档:

(?p…)

类似于普通括号,但 组匹配的子字符串为 可在其他区域访问 通过符号的正则表达式 组名“name”。组名必须为 有效的Python标识符,以及每个 组名只能定义一次 在正则表达式中。A. 符号组也是一个数字组 组,就好像组不是 命名的。因此,在 下面的例子也可以参考 作为编号的第1组

例如,如果模式为
(?P[a-zA-Z_uuw*)
,组可以 由其在参数中的名称引用到 匹配对象的方法,例如
m.group('id')
m.end('id')
,以及 按正则表达式中的名称 自身(使用
(?P=id)
)和更换 提供给
.sub()
(使用
\g
)的文本


我不认为OP要求这样做。原始字符串有两个(不同)日期,所以这不起作用。不管怎样,谢谢。这里也是一样,原始字符串有两个(不同的)日期,所以这不起作用。无论如何,谢谢。@Syed H:在一切平等的情况下,你应该选择第一个正确的答案,这就是你所做的。我添加了我的答案只是作为一种选择。。。谢谢你的评论。
rep1 = "20101215"
rep2 = "20101216"
st = "Looking at dates between 20110316 and 20110317"

print re.sub(r'(?P<fp>.+)[0-9]{8}(?P<lp>.+)[0-9]{8}',
            r'\g<fp>'+rep1+r'\g<lp>'+rep2,st)
m=re.search(r'(?P<fp>.+)[0-9]{8}(?P<lp>.+)[0-9]{8}',st)
if m:
    print m.group('fp')+rep1+m.group('lp')+rep2  #you could use m.group(1) too
else:
    print "no match..."
rndStr = "20101215"
rndStr2 = "20101216"

print "Looking at dates between %s and %s" %(rndStr,rndStr2)