スタック・オーバーフロー Asked by maronie_papa on December 25, 2020
Pythonの正規表現を使い、以下の分割を行いました。
実行したコード
street_address = '東京都港区六本木6-10-1'
pat = '(東京都|北海道|京都府|大阪府|[青森田岩手宮城秋山形福島茨栃木群馬埼玉千葉神奈川
新潟富石井梨長野岐阜静岡愛知三重滋賀兵庫良和歌鳥取根広口徳香媛高佐崎熊本大分鹿児沖縄]
{2,3}県)((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|
十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下>松|岩国|田川|大村|
宮古|富良野|別府|佐伯|黒部|小諸|塩尻|玉野|周南)市|(?:余市|高市|[^市]{2,3}?)郡
(?:玉村|大町|.{1,5}?)[町村]|(?:.{1,4}市)?[^町]{1,4}?区|.{1,7}?[市町村])
(.+)'#1,都道府県 2,市区町村 3,町域以下にマッチする正規表現
street_address_li = re.split(pat, street_address)
street_address_li
出力結果
['', '東京都', '港区', '六本木6-10-1', '']
結果の前後になぜ ''
が入ってしまうのでしょうか?
わかる方いらっしゃればご教示願います。
※業務に支障はないのですが、理屈を知りたいという感じです。
https://docs.python.org/ja/3/library/re.html#re.split
セパレータ中にキャプチャグループがあり、それが文字列の先頭にマッチするなら、結果は空文字列で始まります。同じことが文字列の末尾にも言えます。
メソッドの説明に書いてあるとおりです。
>>> re.split('(a|b)', 'cac')
['c', 'a', 'c']
>>> re.split('(a|c)', 'cac')
['', 'c', '', 'a', '', 'c', '']
この差を考えればいいでしょう。
Correct answer by quickquip on December 25, 2020
re.split()
は正規表現を区切りとして、区切り以外の部分を抽出してリスト化する関数です。street_address
は区切り文字列で始まっているので、空文字列が抽出されます。特殊な動作として、区切り文字正規表現にキャプチャがあるとキャプチャされた文字列も結果に入ります。
例示されているような用途にre.split()
を使うのはとても奇妙で、re.search()
かre.match()
を使うのが適切ではないでしょうか。
match = re.search(pat, street_address)
# 都道府県、市区町村、その他を表示
print(match.group(1), match.group(2), match.group(3))
Answered by int32_t on December 25, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP