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でエンコーディングされた文字として扱えるので使ってください https://t.co/3K9NPxVZ3G
— タッドサン (@tadsan) October 18, 2019
※ご指摘いただきありがとうございます。PHPのpreg_match()
は、u 修飾子を付けることでバイト単位ではなくUTF-8でエンコーディングされた文字として扱えるため、同様に文字数で計算出来るようです。
参考: PHP: 正規表現パターンに使用可能な修飾子 - Manual
株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。