用查找和替换进行乘法运算
正则表达式可以用来做算术运算吗?比如在一个文件中找到所有的数字,然后把它们乘以一个常数。
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
,它会把所有缩放后的数字打印出来。当然,如果你想的话,你可以做一些更有用的事情……