4

我已经学习 vim 并且开始看到它有多么强大(尤其是与 reg 表达式结合使用)。现在我正在尝试用浮点值替换 python 文件中的所有整数。例如,您将遇到需要 [0.0, 0.0, 0.0] 之类的东西

我现在最好的是: :%s/\(\d+\)\@<=s*,/.0,/g 虽然我产生的结果像 0.032.0

两件事情:

  1. 你们中的任何一个正则专家都可以提出一种解决上述问题的可靠方法吗?
  2. 我开始看到这些表达式有多复杂。无论如何要说在我的 .vimrc 中定义一个整数或浮点数的子正则表达式,并有办法将它嵌入到以后的调用中。例如,所需的调用可能是 :%s/\($(AnInt)\)+/-/g 以将整数后的加号更改为减号。(那个或同样模块化的东西)
4

1 回答 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:

于 2012-06-25T00:42:52.663 回答