Vim正则表达式和别名方法

4

我正在学习vim,并开始意识到它的强大之处(尤其是与正则表达式结合使用)。目前我正在尝试将python文件中的所有整数替换为浮点值。

例如,您会遇到像[0, 0, 0]这样的东西,需要改为[0.0,0.0,0.0]

我现在最好的方法是:

:%s/\(\d\+\)\@<=s*,/.0,/g

不过我得到了类似于0.032.0的结果。

两件事:

  1. 有没有任何正则表达式专家能够提供一个解决上述问题的强大方式?
  2. 我开始意识到这些表达式可以变得多么复杂。是否有办法在我的.vimrc中定义子正则表达式,例如整数或浮点数,并有一种嵌入后续调用的方法。例如,所需的调用可能是::%s/\($(AnInt)\)+/-/g,将整数后的加号更改为减号。(或者其他一些同样模块化的方法)

我会使用sed来做这件事,你考虑过这种可能性吗? - TTT
我会尝试使用 :%s/\d\+\ze,/&.0/g,但对于第二个命令不确定。你能否添加替换前和替换后的字符串? - Raimondi
1个回答

4

在假设你得到的结果“像0.032.0”是因为你从0.032开始的情况下,进行以下操作:

注意,这就是当你试图强制使用正则表达式解析非正则语言时会发生的情况。有许多边缘情况,这个正则表达式都无法解析。我将在后面尝试举例说明。

:%s/\(\[.*\)\@<=\([0-9]\+\)\(,[^,]*\.[^,]*\)\@<!\.\@!\(.*\]\)\@=/\2.0/cg

这是怎么工作的?

首先,我想确保我在一个数组内。\(\[.*\)\@<=

这是一个向后查找断言,搜索文字 [

这将在指定为多行的列表上失败,并且在这种情况下也会失败(它将匹配3和4):

for (i,j,k) in zip([0, 0, 0], range(3), listOfLists[4]):

这样做是为了简化。请仔细检查所有匹配项,确保您没有做出不打算的操作。
接下来,我想实际匹配文本,\([0-9]\+\) 简单明了。
接下来,我想确保数字前后没有任何点,但忽略逗号之前和之后的内容。\(,[^,]*\.[^,]*\)\@<! 接下来,我想确保匹配后没有直接跟着一个句点。\.\@! 最后,我想确保匹配后在某个地方有一个字面上的](以确保我在数组内)。\(.*\]\)\@= 然后最后但并非最不重要的是,我用第二个捕获组替换找到的文本,并添加一个句点。
至于您的#2,不,但您可以将这些区域复制到命名的粘贴缓冲区中,并随意使用它们。使用命令编辑模式q:

1
很好的答案。我建议在命令的末尾添加c标志,以便有机会确认/拒绝每个替换。 - romainl
谢谢!非常好用,感谢您深入的回复! - tddCellar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接