【发布时间】:2012-03-26 09:51:08
【问题描述】:
我正在处理固定长度的字段数据,我需要将一系列数字的小数位缩短到只有两位小数。它只是小数点后的零,所以很容易编写一个触发它的正则表达式。问题是,我需要用空格替换多余的零。我知道我可以保存一个子表达式并在替换中调用它,但是有没有办法计算删除的零的数量并调用它?我只是在 Notepad++ 的替换窗口中使用正则表达式。
【问题讨论】:
标签: regex replace notepad++ fixed-length-record
我正在处理固定长度的字段数据,我需要将一系列数字的小数位缩短到只有两位小数。它只是小数点后的零,所以很容易编写一个触发它的正则表达式。问题是,我需要用空格替换多余的零。我知道我可以保存一个子表达式并在替换中调用它,但是有没有办法计算删除的零的数量并调用它?我只是在 Notepad++ 的替换窗口中使用正则表达式。
【问题讨论】:
标签: regex replace notepad++ fixed-length-record
我在这里找到了一些有用的东西。
搜索字符串:([.]00[ ]*)0
替换字符串:\1(1后面有个空格)
它的作用是找到 .00,后跟任意数量的空格,然后是零。然后它用 .00 和空格替换它,然后是一个空格。每次运行时,它都会用空格替换一个额外的零。它有效,但任何人都可以想到只需要运行一次的东西吗?这在这种情况下有效,但我曾有过其他时候希望正则表达式可以计数。
【讨论】:
您需要循环运行它才能正确使用反向引用:
var data = "7.00000000000 5.00000000 8.0 9.000000000000000000000";
var re = /(\.0{0,2})(0*)/;
alert(data.replace(re, RegExp.$1 +RegExp.$2.replace(/0/, 'x')));
编辑:第一个答案崩溃了,这不是 OP 想要的。
【讨论】:
这在这种情况下有效,但我有其他时候希望正则表达式可以计数。
我们不是都曾希望这样吗:)
我发现做你需要的唯一方法是使用 Python 的正则表达式库,它允许你指定一个函数来进行替换,而不是替换字符串。因此,您可以在文件中的每一行进行此调用:
re.sub(search_string, replace_func, line)
这就是你将如何使用它:
import re
search_string = r'(\.0{2})(0+)'
# this function is called for each match, and returns the replace string
def replace_func(match):
num_zeroes = len(match.group(2))
if num_zeroes:
return match.group(1) + num_zeroes * ' '
else:
return ''
for line in ('1234.0', '1234.00', '1234.000', '1234.0000'):
print re.sub(search_string, zero_replacer, line)
不幸的是,这对 Notepad++ 没有帮助,但如果你有兴趣,我可以编写一个更完整的 python 脚本来读取你的文件并完成工作。
【讨论】: