注意,如果你改变的rndStr
或01的值到文本(比如'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)
更妙的是,使用一个更容易理解的语法和检查尝试匹配的回报:
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..."
无论哪种情况,都会生成您想要的字符串Looking at dates between 20101215 and 20101216
。
命名后向引用python的docs:
(?P<name>...)
定期括号相似,但 由组相匹配的字符串是通过符号 的 正则表达式的其余部分中访问组名“name”。组名必须为 有效的Python标识符,并且每个 组名必须在正则表达式中仅定义一次 。 A 符号组也是一个编号为 的组,就好像该组不是 命名。因此,在下面的例子 名为'id'
的组也可被引用作为 编号组1
例如,如果图案是 (?P<id>[a-zA-Z_]\w*)
,该基团可以是 通过其名称在参数参照的 方法匹配的对象,如 m.group('id')
或m.end('id')
,并且还通过 名称在给予.sub()
正则表达式 本身(使用(?P=id)
)和替换 文本(使用\g<id>
)。
我不认为OP要求这样做。 – 2011-03-16 22:13:15
原始字符串有两个(不同)日期,所以这不会工作。不管怎么说,还是要谢谢你。 – 2011-03-17 14:42:58