vim置換メモ: optionタグ => python 辞書型

概要

vimでコード書いていたら、サクッと置換できなかったので、vimでの置換の一例を備忘記録しておく.


問題設定

optionタグで囲まれた情報を、Python辞書型にする. (最終イメージは以下参照)

置換対象の文字列

skymarkの予約ページのhtmlの一部.
# 置換対象文字

<option value="HND">羽田</option>
<option value="AKJ">旭川</option>
<option value="CTS">札幌(新千歳)</option>
<option value="IBR">茨城</option>
<option value="NRT">成田</option>
<option value="NGO">名古屋(中部)</option>
<option value="UKB">神戸</option>
<option value="KKJ">北九州</option>
<option value="FUK">福岡</option>
<option value="NGS">長崎</option>
<option value="KMJ">熊本</option>
<option value="KOJ">鹿児島</option>
<option value="OKA">那覇</option>
<option value="MMY">宮古</option>
こんな形にしたい (GOAL)
airport_info = {
    "haneda"    : "HND", # 羽田
    "asahikawa" : "AKJ", # 旭川
    "sapporo"   : "CTS", # 札幌(新千歳)
    "ibaraki"   : "IBR", # 茨城
    "narita"    : "NRT", # 成田
    "nagoya"    : "NGO", # 名古屋(中部)
    "kobe"      : "UKB", # 神戸
    "kitakyusyu": "KKJ", # 北九州
    "hukuoka"   : "FUK", # 福岡
    "nagasaki"  : "NGS", # 長崎
    "kumamoto"  : "KMJ", # 熊本
    "kagoshima" : "KOJ", # 鹿児島
    "naha"      : "OKA", # 那覇
    "miyako"    : "MMY"  # 宮古
}

Step 1: とりあえず、前方の部分文字列をカット. (vim基本操作)

Ctr+vで短縮選択してxで削除

"HND">羽田</option>
"AKJ">旭川</option>
"CTS">札幌(新千歳)</option>
"IBR">茨城</option>
"NRT">成田</option>
"NGO">名古屋(中部)</option>
"UKB">神戸</option>
"KKJ">北九州</option>
"FUK">福岡</option>
"NGS">長崎</option>
"KMJ">熊本</option>
"KOJ">鹿児島</option>
"OKA">那覇</option>
"MMY">宮古</option>

Step 2-α: パターンマッチを使用した置換

対象を選択した後、以下で置換.

:'<,'>s/">\(.*\)<\/option>/" # \1/g

日本語文字列の部分に()で囲んで、置換後の文字列に再利用する.

そうするとこうなる.

"HND" # 羽田
"AKJ" # 旭川
"CTS" # 札幌(新千歳)
"IBR" # 茨城
"NRT" # 成田
"NGO" # 名古屋(中部)
"UKB" # 神戸
"KKJ" # 北九州
"FUK" # 福岡
"NGS" # 長崎
"KMJ" # 熊本
"KOJ" # 鹿児島
"OKA" # 那覇
"MMY" # 宮古

う〜んもうちょっと、楽したいな〜
てことで、やり直し.

Step 2-β: パターンマッチ(回数指定繰り返し)を使用した置換

αのやつを少し改良する.

'<,'>s/"\([A-Z]\{3\}\)">\(.*\)<\/option>/\t"": "\1", # \2/g

大文字英数字が3回させた文字列にパターンマッチさせた感じ。

そうするとこうなる.

   "": "HND", # 羽田
   "": "AKJ", # 旭川
   "": "CTS", # 札幌(新千歳)
   "": "IBR", # 茨城
   "": "NRT", # 成田
   "": "NGO", # 名古屋(中部)
   "": "UKB", # 神戸
   "": "KKJ", # 北九州
   "": "FUK", # 福岡
   "": "NGS", # 長崎
   "": "KMJ", # 熊本
   "": "KOJ", # 鹿児島
   "": "OKA", # 那覇
   "": "MMY", # 宮古

まぁ満足.

Step3: 手打ちする

あとはしょうがない。手打ちする。
最後の"宮古"のカンマを消して、{}で囲って終わり。


Step2-γ: 番外編 - optionタグの情報のみを利用する場合

こっちの方が利用頻度は多いのでないかと思ったので、一応やってみた.

:'<,'>s/"\([A-Z]\{3\}\)">\(.*\)<\/option>/\t"\1": "\2",/g

置換後の位置を変えただけ.

そうしたらこうなる

    "HND": "羽田",
    "AKJ": "旭川",
    "CTS": "札幌(新千歳)",
    "IBR": "茨城",
    "NRT": "成田",
    "NGO": "名古屋(中部)",
    "UKB": "神戸",
    "KKJ": "北九州",
    "FUK": "福岡",
    "NGS": "長崎",
    "KMJ": "熊本",
    "KOJ": "鹿児島",
    "OKA": "那覇",
    "MMY": "宮古",

感想

このくらいの行数なら、vim基本操作だけで作業した場合と比べて何秒ほどしか作業時間は変わらないと思うが、
置換でできるところまでサクッとできたほうが、生産性高くできるよねっていう話。(作業中にこのエントリーを書くための時間を30分以上費やしてしまったことは置いといて。)
それに、Editor操作は使いこなせた方がかっこいいし。もっとvimの勉強したいな〜。


終わり