2011-06-01 109 views
0

我想将python文件中的5个空格缩进转换为4个空格缩进。我想要命令执行以下操作:关于vim模式匹配的澄清

删除所有以空格开头的行中的单个空格后跟字符。

我发出命令%s/^ \ [a-zA-Z] * //似乎有效。后来我发现命令实际上应该是

删除所有以空格开头的行中的单个空格,然后是任意数量的空格后跟字符。

但是,我仍然无法弄清楚上面的命令是如何工作的。它应该基本上报告错误以下说明模式未找到,但仍然有效。

class H: 
    def __init__(): 
     hell() 
+0

难道你不能用4个空格替换每5个空格吗? – ykatchou 2011-06-01 11:20:32

+0

我发出的命令是这样做的,后来我发现它不应该那样做。我不知道它为什么。 – 2011-06-01 11:27:32

回答

2

它正在工作,因为*的意思是“匹配零个或多个前一个原子”。在你的情况下,它匹配零。你可能想用\+来代替,意思是“匹配以前的一个或多个原子”。

实际上,您可能完全删除了*,因为只有一个空格后跟一个单个字符才会与原来的搜索相匹配。对于你想要完成的事情,有更好的正则表达式,但这不是你在这里问的。

编辑(澄清):

你的正则表达式,因为它代表(^\ [a-zA-Z]*)翻译为:

  • ^:从线的起点
  • \:匹配一个空格
  • [a-zA-Z] :后跟一个字母
  • *:零次或多次(关于pr evious atom - 一个字母)
+0

这意味着它匹配第2和第3行(如我以前的帖子所示)。但为什么它会删除第2行和第3行中的单个空格。 – 2011-06-01 11:25:42

+0

请尝试以下操作:':set hlsearch',然后'/^\ [a-zA-Z] *'。这将向您显示您的正则表达式匹配的内容,以及您的替代命令正在删除的内容。也许这将有助于解释我的答案。 – 2011-06-01 11:27:35

+0

@Randy Morris: - 我得到了以下错误:E486:找不到模式:^ \ [a-zA-Z] – 2011-06-01 11:29:51