CSVデータの解析や、文章を単語ごとに分解する処理など、1つの長い文字列を特定のルールに従って複数のパーツに分割したい場面は頻繁にあります。
Pythonの文字列型には、このための標準メソッドとして split() が用意されています。
この記事では、split() の基本的な使い方と、特によく使われる「空白での分割」における重要な挙動の違いについて解説します。
1. 区切り文字を指定して分割する
split() メソッドの第1引数に「区切り文字(デリミタ)」を指定すると、その文字が出現する場所で文字列が分割され、リスト(list) として返されます。
構文:
リスト = 文字列.split(区切り文字)
具体的な使用例:カンマ区切りデータ (CSV)
# カンマで区切られたデータ
csv_line = "apple,banana,orange,grape"
# "," を区切り文字として指定
fruit_list = csv_line.split(",")
print(f"元の文字列: {csv_line}")
print(f"分割後のリスト: {fruit_list}")
実行結果:
元の文字列: apple,banana,orange,grape
分割後のリスト: ['apple', 'banana', 'orange', 'grape']
2. 空白で分割する(引数の有無による違い)
文章を単語に分ける場合など、「空白(スペース)」で分割したいケースは多いですが、split() に引数を渡すかどうかで挙動が大きく異なります。
引数なし split():空白をよしなに処理(推奨)
引数を省略すると、スペース、タブ、改行などのあらゆる空白文字を区切りとして扱います。さらに、連続する空白はまとめて1つの区切りとみなされ、前後の余計な空白も無視されます。通常はこちらを使用します。
text = " Python is fun. "
# 引数なし(空白を賢く処理)
words = text.split()
print(f"引数なし: {words}")
実行結果:
引数なし: ['Python', 'is', 'fun.']
引数あり split(" "):厳密にスペース1つで分割
明示的に半角スペース " " を指定すると、「スペース1個につき1回分割」します。そのため、スペースが連続していると、間に空文字列 '' が生成されてしまいます。
text = " Python is fun. "
# " " を明示的に指定
words_strict = text.split(" ")
print(f"引数あり: {words_strict}")
実行結果:
引数あり: ['', '', 'Python', '', '', 'is', '', '', 'fun.', '', '']
このように、空文字が大量に含まれたリストになってしまうため、単純な単語分割には不向きです。
3. 分割回数を制限する (maxsplit)
第2引数に数値(maxsplit)を指定すると、分割する回数を制限できます。残りの部分は分割されずに1つの要素としてリストの最後に格納されます。
data = "Key:Value:Detail:Info"
# 最初の1回だけ分割する(キーと値に分ける時などに便利)
result = data.split(":", 1)
print(result)
実行結果:
['Key', 'Value:Detail:Info']
まとめ
str.split(sep): 指定したsepで文字列を分割し、リストを返します。str.split()(引数なし): 連続する空白を無視して単語ごとに分割します。文章の解析にはこれが最適です。str.split(" "): スペース1つごとに厳密に分割するため、連続スペースがあると空文字が含まれます。maxsplit: 分割回数を制限したい場合に使用します。
