概要
- 皆さんはデータの加工で、日本の住所を扱ったことあるでしょうか?
- 例えば 神奈川の県庁所在地 は
神奈川県横浜市中区日本大通1
- こういった文字列から、「都道府県名」 と **「市町村名」**を切り出す作業が存在すると思います。
- 本当は、こちらで紹介されているような方法を採用すると思いますが、、
- 手軽にやりたいので正規表現でやってみたいと思います。軽いネタ程度でお付き合いいただければと。
- 先に結論だけ載せておくと、京都府京都市はかなり手強いです。
ツールの紹介
- 正規表現の確認が爆速になるregex101.com @ Qiita で紹介されているregex101を使ってみたいと思います。
- 確かに便利です。詳細は上記記事を参照いただけれと思います。
使うデータ
- 47都道府県の(都道府)県庁所在地の住所です。
- 47行しか無いので、記事の末尾に貼り付けておきます。イメージとしては下記です。
北海道札幌市中央区北3条西6丁目
青森県青森市長島1-1-1
岩手県盛岡市内丸10-1
(以下省略)
では始めます
①シンプルに都道府県を切り出し
- 都道府県名を切り出すには、「○○ 都・道・府・県」の○○を切り出せばいいので、正規表現で書くと
(.*)["都道府県"]
- 大体、いけているのですが、下記がミスっていますね。。
市町村名 | 区切り | 切り出した都道府県名 |
---|---|---|
栃木県宇都宮市 | 栃木県宇 都 宮市 | 栃木県宇 → ❌ |
山梨県甲府市 | 山梨県甲 府 市 | 山梨県甲 → ❌ |
京都府京都市 | 京都府京 都 市 | 京都府京 → ❌ |
- そうです。正規表現は、なるべく長くマッチ(最長マッチ)で動くので、無駄な文字が含まれます。
- 最短マッチ(**?**を指定)にすればうまくいきそうです。
②都道府県を最短マッチで切り出し
- 先程と一文字だけ変わり、**?**が追加になっています。
- さっき間違っていた3都道府県で見てみると、
(.*?)["都道府県"]
- 最短マッチにしたことで、栃木、山梨は切り出せた!
- ただ、京都が、 京 とは。。
市町村名 | 区切り | 切り出した都道府県名 |
---|---|---|
栃木県宇都宮市 | 栃木 県 宇 都宮市 | 栃木 → 🆗 |
山梨県甲府市 | 山梨 県 甲 府市 | 山梨 → 🆗 |
京都府京都市 | 京 都 府 京 都市 | 京 → ❌ |
③2~3文字条件付き最短マッチで切り出し
- 出現数が任意 *(アスタリスク) なのが失敗の原因です。
- 都道府県名は短くて2文字(埼玉 等)、長くても3文字(鹿児島 等)なので、2~3文字の条件を付けました。
(.{2,3}?)["都道府県"]
- これでやっと正しく切り出せました!
市町村名 | 区切り | 切り出した都道府県名 |
---|---|---|
栃木県宇都宮市 | 栃木 県 宇 都宮市 | 栃木 → 🆗 |
山梨県甲府市 | 山梨 県 甲 府市 | 山梨 → 🆗 |
京都府京都市 | 京都 府 京 都市 | 京都 → 🆗 |
- では調子に乗って、市町村も切り出して行きましょう。
④都道府県 + 市町村 の2つを切り出す
- 先程の都道府県の正規表現に、市町村の切り出し部分を追加しました。
(.{2,3}?)["都道府県"](.*)["市町村"]
- 抜粋ですが、ダメそうな感、満載ですねww
- 正規表現の最長マッチの動作で、市町村以外の取れてしまっています。(仙台市等 → ❌)
- そうです、忘れちゃだめです! 最短マッチの指定を。
⑤都道府県 + 市町村 の2つを切り出す(市町村も最短マッチ)
- 市町村部分も最短マッチになるように ? を付けました!
(.{2,3}?)["都道府県"](.*?)["市町村"]
- はい!だめです!
- 都庁所在地は、新宿 区 ですね。このルールだとマッチ出来ません。 → ❌
- 区 市町村 ですね。区を追加しましょう!
⑥都道府県 + 区市町村 の2つを切り出す
- 区を追加しました。これでどうでしょう。
(.{2,3}?)["都道府県"](.*?)["区市町村"]
- 良さそうですね!やっと完成!
- と思ったら、よくよく見たら
- ルール的には、わかります。ただ、やはりこれ落ちつかないですね。。
- やはり、北海道は、北海道ですね。
⑥北海 → 北海道にする
- もう都道府県の部分は、北海道 or 他の46都府県にしてしまいましょう。
- これで行けるでしょう。
(.{2,3}?["都道府県"]|北海道)(.*?)["区市町村"]
まとめ
一応の完成形
(.{2,3}?["都道府県"]|北海道)(.*?)["区市町村"]
京都の強さ
見慣れた北海道
お礼
- こんなくだらない記事に最後までお付き合いいただきありがとうございました。
- 最後に利用した住所一覧を添付しておきます。
(付録) 使ったデータ
北海道札幌市中央区北3条西6丁目
青森県青森市長島1-1-1
岩手県盛岡市内丸10-1
宮城県仙台市青葉区本町3-8-1
秋田県秋田市山王4-1-1
山形県山形市松波2-8-1
福島県福島市杉妻町2-16
茨城県水戸市笠原町978-6
栃木県宇都宮市塙田1-1-20
群馬県前橋市大手町1-1-1
埼玉県さいたま市浦和区高砂3-15-1
千葉県千葉市中央区市場町1-1
東京都新宿区西新宿2-8-1
神奈川県横浜市中区日本大通1
新潟県新潟市中央区新光町4-1
富山県富山市新総曲輪1-7
石川県金沢市鞍月1-1
福井県福井市大手3-17-1
山梨県甲府市丸の内1-6-1
長野県長野市大字南長野字幅下692-2
岐阜県岐阜市薮田南2-1-1
静岡県静岡市葵区追手町9-6
愛知県名古屋市中区三の丸3-1-2
三重県津市広明町13番地
滋賀県大津市京町4-1-1
京都府京都市上京区下立売通新町西入薮ノ内町
大阪府大阪市中央区大手前2丁目
兵庫県神戸市中央区下山手通5-10-1
奈良県奈良市登大路町30
和歌山県和歌山市小松原通1-1
鳥取県鳥取市東町1-220
島根県松江市殿町1番地
岡山県岡山市北区内山下2-4-6
広島県広島市中区基町10-52
山口県山口市滝町1-1
徳島県徳島市万代町1-1
香川県高松市番町4-1-10
愛媛県松山市一番町4-4-2
高知県高知市丸ノ内1-2-20
福岡県福岡市博多区東公園7-7
佐賀県佐賀市城内1-1-59
長崎県長崎市尾上町3-1
熊本県熊本市中央区水前寺6-18-1
大分県大分市大手町3-1-1
宮崎県宮崎市橘通東2-10-1
鹿児島県鹿児島市鴨池新町10-1
沖縄県那覇市泉崎1-2-2