PHP / Ruby / Python: 住所から正規表現で都道府県を抽出してみる

BPSの福岡拠点として一緒にお仕事させて頂いてます、株式会社ウイングドアのアリタです。

サイト開発を行なっていると、ユーザー情報や会社情報などで入力された住所データを扱う事があると思います。
今回は正規表現を使って住所から「都道府県」を抽出する方法をご紹介します。

前提

今回は下記の前提のもとで進めていきます。

  • 「都道府県」より下の市区町村などは今回スコープ外
  • 住所の文字コードはUTF-8を想定
  • PHP / Ruby / Pythonの各言語で住所から都道府県を抽出する

PHPで都道府県を抽出してみる

さくっと試すため、PHPのインタラクティブモードを利用します。

$ php -a
Interactive shell

住所を$addressという変数に代入します(ここではBPSさんの住所を引用)。

php > $address = "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST 2F";

正規表現を利用して、preg_match_allにてマッチした結果を抽出します。

php > $regex = '/東京都|北海道|(?:京都|大阪)府|.{6,9}県/';
php > preg_match_all($regex, $address, $matches);

結果をvar_dump。 無事、配列の1番目のインデックスに「東京都」が抽出できました!

php > var_dump($matches);
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(9) "東京都"
  }
}

念のため、他の住所も試してみます。(ウイングドアの住所を引用)

php > $address = "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F";
php > $regex = '/東京都|北海道|(?:京都|大阪)府|.{6,9}県/';
php > preg_match_all($regex, $address, $matches);
php > var_dump($matches);
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(9) "福岡県"
  }
}

配列の1番目のインデックスに「福岡県」が抽出されています。大丈夫そうですね。

Rubyで都道府県を抽出してみる

rails consoleを起動。

$ rails c

住所をaddressという変数に代入。(ここではBPSさんの住所を引用)

[1] pry(main)> address = "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST"
=> "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST"

正規表現を利用して、マッチした結果を抽出します(追記2019/10/18: 正規表現を修正しました🙇)。

[2] pry(main)> address.match(/^.{2,3}[都道府県]/).to_s
=> "東京都"

無事、「東京都」が抽出できました。
・・・というかRubyすごい。簡単すぎる。

念のため、他の住所も試してみます。(ウイングドアの住所を引用)

[1] pry(main)> address = "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F"
=> "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F"
[2] pry(main)> address.match(/^.{2,3}[都道府県]/).to_s
=> "福岡県"

無事、「福岡県」が抽出されました。

備考

下記のように 東京都|北海道|(?:京都|大阪)府|.{2,3}県 という正規表現でも取得する事が可能です。

[1] pry(main)> address = "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST"
=> "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST"
[2] pry(main)> address.match(/東京都|北海道|(?:京都|大阪)府|.{2,3}県/).to_s
=> "東京都"
[1] pry(main)> address = "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F"
=> "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F"
[2] pry(main)> address.match(/東京都|北海道|(?:京都|大阪)府|.{2,3}県/).to_s
=> "福岡県"

Pythonで都道府県を抽出してみる

インタラクティブモードで起動

$ python3

正規表現操作のライブラリre をimport。

>>> import re

住所をaddressという変数に代入。(ここではBPSさんの住所を引用)

>>> address = "東京都新宿区西新宿6-20-7コンシェリア西新宿TOWER’S WEST 2F"

正規表現を利用して、マッチした結果を抽出します。

>>> matches = re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県' , address)
>>> print(matches)
<_sre.SRE_Match object; span=(0, 3), match='東京都'>

無事、「東京都」が抽出できました。

念のため、他の住所も試してみます。(ウイングドアの住所を引用)

>>> import re
>>> address = "福岡県福岡市中央区天神4丁目1−28 天神リベラ 3F"
>>> matches = re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県' , address)
>>> print(matches)
<_sre.SRE_Match object; span=(0, 3), match='福岡県'>

無事、「福岡県」が抽出されました。

まとめ

今回、PHP / Ruby / Python 各言語で住所から「都道府県」を抽出する事が出来ました。
感想としては、Rubyが簡単すぎるにつきます (ただ、市区町村まで考慮すると大変みたいです)。

また、PHP / Ruby・Python で県の箇所の数字が「.{6,9}県」、「.{2,3}県」と異なっているのも面白いなと思いました。PHPの方は(UTF-8のため)1文字3バイト計算で、Ruby・Pythonは文字数で計算されているようです。

正規表現を使えば(使いこなせば)、郵便番号、メールアドレスなどなど
色々な文字列を抽出出来るので、是非色々試してみてください!

追記(2019/10/24)

※ご指摘いただきありがとうございます。PHPのpreg_match()は、u 修飾子を付けることでバイト単位ではなくUTF-8でエンコーディングされた文字として扱えるため、同様に文字数で計算出来るようです。

参考: PHP: 正規表現パターンに使用可能な修飾子 - Manual


株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

関連記事

はじめての正規表現とベストプラクティス#1: 基本となる8つの正規表現

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

wingdoor

株式会社ウイングドアは福岡のシステム開発会社です。Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、 スマホアプリや業務系システムなど様々なシステム開発を承っています。 中途採用を絶賛募集しています! https://wingdoor.co.jp/

wingdoorの書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ