住所を表す文字列から市区町村を抽出したい,という場面があろうかと思います。
手っ取り早く思いつく手段としては,/[都道府県].+[市区町村]/
といった正規表現を用いることです。
が,この方法,たとえば 東京都東村山(市) のように,市区町村の名称に「市」「町」「村」の文字を含む地方公共団体があるため,失敗します(ちなみに東村山(市)繋がりで言えば,沖縄県に「東村」という村があります。)。
そこで,たとえば簡単な正規表現でmatch
した文字列について,このような 市町村名が[市町村]
を含む市町村のリスト に引っかからないかチェックする,といったロジックが考えられます。(全部を正規表現で処理すると大変なので…。)
ということで,そのようなリストを作ってみましょう。
「全ての市町村のリスト」は総務省が持っている。
今日現在,全国には1,724の市町村と23の特別区があるそうですが(→政府統計),全ての市区町村には6桁の**地方公共団体コード**が振られており,そのコードの一覧表が,総務省のWebサイトに置いてあります。
→ http://www.soumu.go.jp/denshijiti/code.html
そこで,上記リンク先からExcelファイルをダウンロードして使います。
もっとも,Excelのままだと使いにくいので,中のシートをCVSファイルとして書き出しておきます。
(「平成30年10月1日現在」とのことなので,市町村コード20181001.csvとでもしておきます。)
CSVファイルをgrepする。
こうして取得した全市町村名リストから,市町村名に[市町村]
を含む市町村 を抽出してみましょう。
ファイルの中身は,1行に
6桁の数字,都道府県名,市町村名,都道府県名半角カナ,市町村名半角カナ,,
という内容なので,これを前提にgrepすればOK。
簡単なバージョン
とりあえず,私はこんな感じにしました。
$ grep -E ",[^,]*[市区町村][^,]*[市区町村]," 市町村コード20181001.csv
=>
014087,北海道,余市町,ホッカイドウ,ヨイチチョウ,,
043222,宮城県,村田町,ミヤギケン,ムラタマチ,,
062081,山形県,村山市,ヤマガタケン,ムラヤマシ,,
072117,福島県,田村市,フクシマケン,タムラシ,,
093441,栃木県,市貝町,トチギケン,イチカイマチ,,
104647,群馬県,玉村町,グンマケン,タマムラマチ,,
122033,千葉県,市川市,チバケン,イチカワシ,,
122190,千葉県,市原市,チバケン,イチハラシ,,
132098,東京都,町田市,トウキョウト,マチダシ,,
132136,東京都,東村山市,トウキョウト,ヒガシムラヤマシ,,
132233,東京都,武蔵村山市,トウキョウト,ムサシムラヤマシ,,
132276,東京都,羽村市,トウキョウト,ハムラシ,,
152102,新潟県,十日町市,ニイガタケン,トオカマチシ,,
152129,新潟県,村上市,ニイガタケン,ムラカミシ,,
163228,富山県,上市町,トヤマケン,カミイチマチ,,
172120,石川県,野々市市,イシカワケン,ノノイチシ,,
193461,山梨県,市川三郷町,ヤマナシケン,イチカワミサトチョウ,,
202126,長野県,大町市,ナガノケン,オオマチシ,,
242021,三重県,四日市市,ミエケン,ヨッカイチシ,,
284424,兵庫県,市川町,ヒョウゴケン,イチカワチョウ,,
294438,奈良県,下市町,ナラケン,シモイチチョウ,,
342131,広島県,廿日市市,ヒロシマケン,ハツカイチシ,,
414239,佐賀県,大町町,サガケン,オオマチチョウ,,
422053,長崎県,大村市,ナガサキケン,オオムラシ,,
ということで,24の地方自治体が抽出できたので,あとはこのリストを適当に整形して使えばOK。
先頭2文字が市町村である場合は除外するバージョン
ところで,上記のリストから分かるように,現在,市町村名に市町村の文字が含まれる市町村の市町村名は,全て3文字以上です。
ということは,除外のロジックを組む際には,住所文字列の3文字目以降に市町村の文字がある場合にリストをチェックする,という手法も考えられます。
市町村名の3文字目以降に市町村の文字を含む市町村,抽出してみましょう。
$ grep -E ",[^,市町村]{2,}[^,]*[市区町村][^,]*[市区町村]," 市町村コード20181001.csv
=>
132233,東京都,武蔵村山市,トウキョウト,ムサシムラヤマシ,,
152102,新潟県,十日町市,ニイガタケン,トオカマチシ,,
172120,石川県,野々市市,イシカワケン,ノノイチシ,,
242021,三重県,四日市市,ミエケン,ヨッカイチシ,,
342131,広島県,廿日市市,ヒロシマケン,ハツカイチシ,,
地方自治体の数が5つに絞られました。これなら,コードの冒頭にリストを付けても目立たないかも。
ちなみに,「武蔵(村)」「十日(町)」「野々(市)」「四日(市)」「廿日(市)」という市町村は存在しないので,たとえば「武蔵村」にmatchする場合は,市町村名が「武蔵村山市」であると断定できます。
(ちなみに東京都東村山市は沖縄県東村と被るので,先頭1文字が市町村である場合を除外したリストだと,上記のロジックは使えないかもしれません。)
気を付けたいのは「市町村名に市町村の文字が含まれる市町村の市町村名が全て3文字以上である」というのは,今日現在たまたまそうであるに過ぎないことです。
もし将来,市町村の合併等で「村(市)」のような市町村が誕生した場合には,上記のような縮小版リストを前提にしたロジックが死ぬ可能性がある点は留意しましょう。
(本稿が,単にリストを掲載するのではなく,リストの作り方を記事化しているのも,市町村名の変更に応じてリストを更新できるようにするためです。)
「市町村名に市町村が含まれる市町村」の志布志市志布志感はわざとです。
Enjoy!
#追記(余談):「郡」を含む市町村
grep 郡 市町村コード20181001.csv
=>
072036,福島県,郡山市,フクシマケン,コオリヤマシ,,
212199,岐阜県,郡上市,ギフケン,グジョウシ,,
232149,愛知県,蒲郡市,アイチケン,ガマゴオリシ,,
284815,兵庫県,上郡町,ヒョウゴケン,カミゴオリチョウ,,
292036,奈良県,大和郡山市,ナラケン,ヤマトコオリヤマシ,,
402168,福岡県,小郡市,フクオカケン,オゴオリシ,,