【问题标题】:Conditional replacement of numbers with regex用正则表达式有条件地替换数字
【发布时间】:2017-05-01 14:01:08
【问题描述】:

输入:

foobar10000foobar
foobar1000foobar
foobar100foobar
foobar10foobar
foobarfoobar

期望的输出:

foobar4foobar
foobar3foobar
foobar2foobar
foobar1foobar
foobar0foobar

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

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

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

【问题讨论】:

    标签: python regex sublimetext3


    【解决方案1】:

    您可以,因为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,就像您最后想要的输出一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2020-05-01
      • 2012-07-15
      • 2012-01-25
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多