最初想确定页号的起始位置之后用字符串切片和拼接完成替换,但是有些不太优雅。stackoverflow 上有一些解决方案都没有结合正则,思想上都是维护一个变量,然后匹配到第 N 次的时候才执行替换。那么对于这种很常见的需求,re 模块中难道就没有内建的支持吗?仔细阅读了一下 re 模块文档中的 sub 函数说明,发现了一个原来没有注意到的特性: 大意是如果 sub 函数的第二个参数是个函数,则每次匹配到的时候都会执行这个函数。函数接受匹配到的那个 match object 作为参数,返回用来替换的字符串。利用这个特性就可以只在第 N 次匹配的时候返回要替换成的字符串,其他时候原样返回不做替换即可。 现在就只需要考虑如何维护一个在多次调用时不被重置的变量,最终在 Python 邮件列表中找到一个帖子使用类变量而非全局变量优雅地解决了这个问题。根据我的需要修改后的代码如下: class Nth(object): def __init__(self, nth, replacement): self.nth = nth self.replacement = replacement self.calls = 0 def __call__(self, matchobj): self.calls += 1 if self.calls == self.nth: return self.replacement return matchobj.group(0)最后调用的时候如下执行即可获得首页链接: re.sub('\d+', Nth(i, '1'), url) 转载请保留固定链接: https://linuxeye.com/program/2017.html |