【正規表現】Pythonのsplitで区切り文字を返却リスト要素に含める方法

splitは指定した文字で目的の文字列を区切って、区切られたそれぞれの要素をリストとして返却するメソッドです。

似たようなメソッドはほかの言語にも存在します。

「splitで区切り文字列を返却要素に含めたい」と思って色々調べたのでメモ書き残し。

splitの使い方

&で区切られたそれぞれの文字列が返却されます。
区切りとなる文字「&」は消え去って返ってくる事はありません。
これが基本です。

目的:splitの区切り文字列を返却要素に含める

文字列操作をしていると区切り文字列も返却要素内に欲しいパターンがあります。

【参考サイト】

含まれるには含まれた。

が、やりたいのはこうじゃない。

こうなってほしい。

結論:splitでは無理

結論から言うとsplitでは無理っぽいという着地です(笑)
もちろん、ごちゃごちゃいじくり回せばいくらでもやり方は思いつくのですが、短く簡潔に表現したいですよね。

区切り文字を前の要素に含める形で再現

ってことで、正規表現モジュール[re]をインポートします。

なるほど。それっぽい。
まぁこれで事足りる場合も多いかと思います。

正規表現なら「区切りがない」文字列にも対応できる

そもそも何で区切ればいいのか分からないパターンでも、正規表現なら抜き出せます。例えばこんな文字列です。

これは難しいですよね・・・。そもそも何を区切り文字として指定すればいいのかわかりません。

勿論、splitを使ってやろうと思えば何とかできます。

出来るには出来ますが、ダサいですね。
一回外した"【"を再度付け直している辺りが非常にダサいです。美しくない。

re.findallで美しく華麗に抜き出す

どうです?カッコよくないですか?

ポイントは"【" から次の"【"までをひとまとまりと考えて、カッコ内抜出の正規表現を応用します。

【参考サイト】正規表現:括弧の中身だけをマッチする表現

カッコを含めて一致するパターンと、カッコ内部にだけ一致するパターンを応用して組み合わせています。

正規表現の内容を解説

部分的に解説します。

【】に囲まれた文字列に【】を含めてマッチするパターン

【】自体を含めて「マッチした」と見なします。

【】に囲まれた内部の文字列だけにマッチするパターン

肯定先読みという表現です。

よく似ていますが、こちらは肯定戻り読みという表現です。

これらを組み合わせると【】内部だけを抜き出す表現になります。

正規表現部品解説
肯定戻り読み
  •  (?<=【)

"【"より後で出現した正規表現部分をマッチ部分と見なす。

最短一致(抜き出される本体)
  •  .*?

任意の一文字、0回以上の繰り返し、
?の直後の文字列までをマッチ部分とみなす。

肯定先読み
  •  (?=】)

"】"より前に出現した正規表現部分をマッチ部分と見なす。

まとめ

splitでやるよりもスマートにできたと思います。

正規表現自体はなんだかややこしくて最初のうちは上手く書くのは難しいですが、慣れてくればあらゆる文字列操作に対応できるようになるパワフルなメソッドですね。

しかも基本的に正規表現自体は言語を問わず使えるので一度覚えるとどの言語に移ってもそのままの知識で利用できるのがイイところです。

¥5,184 (2019/09/19 00:36:59時点 Amazon調べ-詳細)