Pythonic方法在评估匹配的字符串时执行类似Ruby的正则表达式替换

Jul*_*lik 1 ruby python regex coding-style block

我有这个简单的正则表达式替换代码,其中包含一个块.当Ruby执行gsub时,匹配将传递给块,并且从块返回的任何内容都将用作替换.

string = "/foo/bar.####.tif"
string.gsub(/#+/) { | match | "%0#{match.length}d" } # => "/foo/bar.%04d.tif"
Run Code Online (Sandbox Code Playgroud)

有没有办法在Python中做到这一点,同时保持简洁?是否有支持lambdas或with语句的++ replace ++变体?

小智 8

re.sub接受函数作为替换.它将匹配对象作为唯一参数获取并返回替换字符串.

如果你想让它成为一个oneliner,一个lambda将起作用:re.sub(r'#+', lambda m: "%0"+str(len(m.group(0))), string).我只是使用一个小的三行def来避免在一个地方放置所有那些parens,但这只是我的意见.