69057


Pythonの正規表現を使い、以下の分割を行いました。

**実行したコード**

[code]

    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
    
[/code]

**出力結果**

[code]

    ['', '東京都', '港区', '六本木6-10-1', '']
    
[/code]

### 質問

結果の前後になぜ `''` が入ってしまうのでしょうか？  
わかる方いらっしゃればご教示願います。  
※業務に支障はないのですが、理屈を知りたいという感じです。


CC BY-SA 4.0
2020-07-28T04:40:17.827
69055
2020-07-28T06:49:32.827
2020-07-28T06:49:32.827
3060
39734
question
python python3 正規表現
re.split での出力結果に空の文字列が含まれるのはなぜ？


<https://docs.python.org/ja/3/library/re.html#re.split>

> セパレータ中にキャプチャグループがあり、それが文字列の先頭にマッチするなら、結果は空文字列で始まります。同じことが文字列の末尾にも言えます。

メソッドの説明に書いてあるとおりです。

[code]

    >>> re.split('(a|b)',  'cac')
    ['c', 'a', 'c']
    
    
    >>> re.split('(a|c)',  'cac')
    ['', 'c', '', 'a', '', 'c', '']
    
[/code]

この差を考えればいいでしょう。


CC BY-SA 4.0
2020-07-28T04:58:01.607
69057
2020-07-28T04:58:01.607
12274
69055
answer


[`re.split()`](https://docs.python.org/ja/3/library/re.html#re.split)
は正規表現を区切りとして、区切り以外の部分を抽出してリスト化する関数です。`street_address`は区切り文字列で始まっているので、空文字列が抽出されます。特殊な動作として、区切り文字正規表現にキャプチャがあるとキャプチャされた文字列も結果に入ります。

例示されているような用途に`re.split()`を使うのはとても奇妙で、[`re.search()`](https://docs.python.org/ja/3/library/re.html#re.search)か[`re.match()`](https://docs.python.org/ja/3/library/re.html#re.match)を使うのが適切ではないでしょうか。

[code]

    match = re.search(pat, street_address)
    # 都道府県、市区町村、その他を表示
    print(match.group(1), match.group(2), match.group(3))
    
[/code]


CC BY-SA 4.0
2020-07-28T05:25:29.473
69060
2020-07-28T05:25:29.473
3475
69055
answer