2012-06-24 59 views
4

我已經學習了vim並開始看到它是多麼強大(特別是與reg表達式結合在一起)。 現在我試圖用浮動值替換python文件中的所有整數。 例如你會跨越東西COM如[0,0,0]需要被[0.0,0.0,0.0]Vim reg表達式和別名方法

我現在所擁有的最好的是: :%s/\(\ d + \)\ @ < = S *,/ 0/G 雖然我喜歡製作0.032.0

兩件事情的結果:

  1. 可以任你regexperts掀起一個可靠的方法來解決上述問題?
  2. 我開始看到這些表達式可以得到多麼複雜。無論如何要說在我的.vimrc中定義一個整數或浮點數的subregex,並且有辦法將它嵌入到以後的調用中。例如所需的調用可能是:%s/\($(AnInt)\)+/-/g,將整數後面的加號改爲最小值。 (也或者同樣模塊化)
+0

我會使用sed,你有沒有考慮過這種可能性? – TTT

+0

我會用':%s/\ d \ + \ ze,/&。0/g'來嘗試,我不確定第二個。你可以在替換之前和之後添加字符串嗎? – Raimondi

回答

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

+0

好主意。添加。 – OmnipotentEntity

+0

謝謝!偉大的工作,感謝您的洞察力/通過反應! – tddCellar