如何在Python中使用匹配的组和变量进行sub
python新手。这可能很简单,但我还没有找到答案如何在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
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)