输入:
foobar10000foobar
foobar1000foobar
foobar100foobar
foobar10foobar
foobarfoobar
期望的输出:
foobar4foobar
foobar3foobar
foobar2foobar
foobar1foobar
foobar0foobar
换句话说,替换应该是匹配数字中包含的零的数量。这些示例已经包含所有可能的数字:{none, 10, 100, 1000, 10000} 。
有没有办法用一个正则表达式语句来做到这一点?
(附带信息:我想为 Sublime Text 3 的 RegReplace 包实现一个规则)
请您参考如下方法:
你可以,因为 re.sub 接受一个函数作为替换。参见 re.sub
替换函数接受一个匹配对象作为参数,并且必须返回一个字符串。
import re
texts = ['foobar10000foobar', 'foobar100foobar',
'foobar1foobar', 'foobarfoobar']
def zeros_count(matchobj):
return str(matchobj.group(0).count('0'))
def replace_zeros(text):
return re.sub(r'\d+', zeros_count, text)
for text in texts:
print(text, '-->', replace_zeros(text))
# foobar10000foobar --> foobar4foobar
# foobar100foobar --> foobar2foobar
# foobar1foobar --> foobar0foobar
# foobarfoobar --> foobarfoobar
请注意,在最后一种情况下,没有要替换的数字,因此没有逻辑位置可以插入 0,就像您最后想要的输出一样。
