vim置換メモ: optionタグ => python 辞書型
問題設定
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": "宮古",