使用正则表达式有条件地替换数字

时间:2017-05-01 14:01:09

标签: python regex sublimetext3

输入:

foobar10000foobar
foobar1000foobar
foobar100foobar
foobar10foobar
foobarfoobar

期望输出:

foobar4foobar
foobar3foobar
foobar2foobar
foobar1foobar
foobar0foobar

换句话说,替换应该是匹配数字中包含的零的数量。示例已包含所有可能的数字:{,10,100,1000,10000}。

有没有办法用一个正则表达式语句来做?

(旁边信息:我想为Sublime Text 3的RegReplace包实施规则)

1 个答案:

答案 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,就像在上一个所需的输出中一样。

相关问题