输入:
foobar10000foobar
foobar1000foobar
foobar100foobar
foobar10foobar
foobarfoobar
期望输出:
foobar4foobar
foobar3foobar
foobar2foobar
foobar1foobar
foobar0foobar
换句话说,替换应该是匹配数字中包含的零的数量。示例已包含所有可能的数字:{无,10,100,1000,10000}。
有没有办法用一个正则表达式语句来做?
(旁边信息:我想为Sublime Text 3的RegReplace包实施规则)
答案 0 :(得分:3)
您可以,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,就像在上一个所需的输出中一样。