2011-06-01 94 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