Magicode logo
Magicode
3
2 min read

[Python]正規表現のみで住所を「都道府県/市区町村/その他」に分割する方法

https://cdn.apollon.ai/media/notebox/d6e08c22-1056-4b87-8754-22bcf9921222.jpeg

はじめに

Pythonエンジニアをやっています。 業務効率化や自動化が主戦場ですので少しでも同分野でお役に立てればと思い書きます。

やりたいこと

入力した住所を「都道府県/市区町村/その他」の3分割にしたい!
例えばこんなのを…東京都港区六本木1-2-3
こんなのに…東京都,港区,六本木1-2-3
郵便局が公開している郵便番号データを使って、自分で辞書を作って…これは大変だし処理も重い。
そこで!正規表現で「ある程度まで」の分割をやっていきましょう。

方法について

Python3標準ライブラリの「re」で正規表現をつかったパターンマッチングで分割をする。

正規表現

(...??[都道府県])((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村|宮古|富良野|別府|佐伯|黒部|小諸|塩尻|玉野|周南)市|(?:余市|高市|[^市]{2,3}?)郡(?:玉村|大町|.{1,5}?)[町村]|(?:.{1,4}市)?[^町]{1,4}?区|.{1,7}?[市町村])(.+)
を採用しました。本当にありがとうございます。

Pythonでサクッと実装

python
import re

content = '東京都港区六本木1-2-3'

pattern = '''(...??[都道府県])((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|
富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村|宮古|富良野|別府|佐伯|黒部|小諸|塩尻|玉野|
周南)市|(?:余市|高市|[^市]{2,3}?)郡(?:玉村|大町|.{1,5}?)[町村]|(?:.{1,4}市)?[^町]{1,4}?区|.{1,7}?[市町村])(.+)'''

result = re.match(pattern, content)

if result: #正規表現パターンにマッチした場合
  print(result.group(1)) #都道府県
  print(result.group(2)) #市区町村
  print(result.group(3)) #その他

おわりに

正規表現は腐らない。 5年以上前の記事を参考に実装してみましたが、私の現場で扱うには十分過ぎる結果を出すことができました。
少しでも誰かのご参考になれば幸いです。

Discussion

コメントにはログインが必要です。