用查找和替换进行乘法运算

3 投票
6 回答
2538 浏览
提问于 2025-04-15 21:57

正则表达式可以用来做算术运算吗?比如在一个文件中找到所有的数字,然后把它们乘以一个常数。

6 个回答

4

在Perl语言中,你可以使用/e这个修饰符来实现这个功能。这个修饰符会让表达式中的替换部分被计算出来。假设$line里面存储的是文件中的一行内容。

 my $scalar= 4;
 $line =~ s/([\d]+)/$1*$scalar/ge;

把这个方法应用到每一行上,就能完成你的任务。例如,如果$line里面的内容是"foo2 bar25 baz",经过处理后,它会变成"foo8 bar100 baz"。

8

你可以使用 re.sub() 这个函数来实现这个功能,并且可以用一个回调函数:

import re

def repl(matchobj):
  i = int(matchobj.group(0))
  return str(i * 2)

print re.sub(r'\d+', repl, '1 a20 300c')

输出结果:

2 a40 600c

来自文档的说明:

re.sub(模式, 替换内容, 字符串[, 计数])

如果替换内容是一个函数,那么这个函数会在每次找到不重叠的模式时被调用。这个函数会接收一个匹配对象作为参数,并返回要替换的字符串。

2

我准备了一个小脚本,使用了 re.finditer 这个功能来找到所有的整数(你可以修改这个正则表达式,让它也能处理小数或科学计数法),然后用 map 来返回一个缩放后的数字列表。

import re

def scale(fact):
    """This function returns a lambda which will scale a number by a                           
    factor 'fact'"""
    return lambda val: fact * val

def find_and_scale(file, fact):
    """This function will find all the numbers (integers) in a file and                        
    return a list of all such numbers scaled by a factor 'fact'"""
    num = re.compile('(\d+)')
    scaling = scale(fact)
    f = open(file, 'r').read()
    numbers = [int(m.group(1)) for m in num.finditer(f)]
    return map(scaling, numbers)

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 3:
        print "usage: %s file factor" % sys.argv[0]
        sys.exit(-1)
    numbers = find_and_scale(sys.argv[1], int(sys.argv[2]))
    for number in numbers:
        print "%d " % number

如果你有一个 file 文件,里面的数字想要按一个比例 fact 来缩放,你可以在命令行中这样调用这个脚本:python script.py file fact,它会把所有缩放后的数字打印出来。当然,如果你想的话,你可以做一些更有用的事情……

撰写回答