Pythonで文字列をリストに分割する場合、標準の split() メソッドがよく使用されます。しかし、split() は単一の区切り文字しか指定できないため、「カンマとスペースが混在しているデータ」などを一度に処理するには不向きです。
正規表現モジュール re の split() 関数を使用すれば、複数の区切り文字や複雑なパターンを指定して、柔軟に文字列を分割することができます。
re.split の基本とメリット
re.split は、正規表現パターンに一致した部分で文字列を分割する関数です。
re.split(正規表現パターン, 対象の文字列)
最大の利点は、否定文字クラス([^...])などを活用することで、「特定の文字以外すべてを区切り文字として扱う」といった強力な指定ができる点にあります。これにより、データの区切り形式が統一されていない「汚いデータ」のクレンジングも容易に行えます。
実装例:表記揺れのあるタグ情報の分割
ユーザー入力などで、区切り文字が「カンマ」「スペース」「セミコロン」などで不統一なタグリストを、きれいなリスト形式に変換するコード例を紹介します。
import re
def main():
# 区切り文字が統一されていない入力データ
# "Python, Programming;Code Development" のような状態
raw_tags = "Python, Programming;Code Development"
print(f"元の文字列: '{raw_tags}'")
# 正規表現による分割
# r"[^a-zA-Z0-9]+" の解説:
# [^...] : カッコ内の文字「以外」にマッチ(否定)
# a-zA-Z0-9 : 英数字
# + : 1回以上の繰り返し
# つまり、「英数字以外の文字の塊」を区切り文字として扱います
tag_list = re.split(r"[^a-zA-Z0-9]+", raw_tags)
# 結果の出力
print(f"分割後のリスト: {tag_list}")
# 注意点: 文字列の先頭や末尾に区切り文字がある場合、空文字が含まれることがあります
# これを除去するにはリスト内包表記でフィルタリングします
clean_list = [t for t in tag_list if t]
print(f"空文字除去後: {clean_list}")
if __name__ == "__main__":
main()
コードの解説
否定文字クラス [^...] の活用
コードで使用した正規表現 r"[^a-zA-Z0-9]+" は、「英字(a-z, A-Z)と数字(0-9)ではないもの」をすべて区切り文字とみなす設定です。 これにより、カンマ(,)、セミコロン(;)、スペース()などが個別に指定されていなくても、すべて「区切り」として処理されます。
+ (1回以上の繰り返し) の重要性
正規表現の末尾にある + は非常に重要です。これがない場合、例えばスペースが2つ連続している場所()で分割すると、間に空の文字列が発生してしまいます。 + を指定することで、連続する区切り文字(例:, や )を「1つの大きな区切り」としてまとめて処理できるため、結果のリストがクリーンになります。
まとめ
re.split は、単純な区切り文字指定では対応しきれない複雑なテキストデータの解析に威力を発揮します。
str.split(): データが整っており、区切り文字が明確な場合に高速です。re.split(): 区切り文字が不明確、または複数種類混在している場合に有効です。
特にログ解析や自然言語処理の前処理において、不要な記号を除去しつつ単語リストを作成する際に重宝するテクニックです。
