文字列を分割するとはどういうことか
Pythonで文字列を扱っていると、「1行のテキストを項目ごとに分けたい」「カンマ区切りのデータを分解したい」「URLやパスを部品に分けたい」といった場面が頻繁に出てきます。 こうした「1つの文字列を、意味のある小さなかたまりに分ける」操作が 文字列の分割(split) です。
分割は、
- 入力データの解析
- 設定ファイルやログの読み取り
- 簡易的なパーサの作成 などの基礎になります。ここでは、初心者向けにステップバイステップで考えながら、
split()を中心に、例題・テンプレート・注意点を丁寧に解説していきます。
基本の分割:str.split() の使い方
区切り文字を指定して分割する
line = "apple,banana,orange"
items = line.split(",")
print(items) # ['apple', 'banana', 'orange']
Python文字列.split(区切り文字) と書くことで、
- 区切り文字のところで文字列を切り分け
- それぞれを要素とするリスト を返します。
この例では、
"apple,banana,orange"を","で分割して["apple", "banana", "orange"]というリストにしています。
スペース区切りで分割する
text = "Python で 文字列 を 分割 します"
words = text.split(" ")
print(words) # ['Python', 'で', '文字列', 'を', '分割', 'します']
Pythonスペースを区切り文字にすると、 文章を単語ごとに分けることができます。
区切り文字を省略した場合
text = "Python で 文字列 を 分割 します"
words = text.split()
print(words) # ['Python', 'で', '文字列', 'を', '分割', 'します']
Python区切り文字を省略すると、
- 連続する空白(スペース・タブ・改行)をまとめて区切りとして扱う という挙動になります。 「単語に分けたい」ときは、
split()を引数なしで使うのが便利です。
分割結果のリストをどう扱うか
インデックスで取り出す
line = "name=Taro;age=20;city=Tokyo"
parts = line.split(";")
print(parts[0]) # name=Taro
print(parts[1]) # age=20
print(parts[2]) # city=Tokyo
Python分割結果はリストなので、 インデックスで個々の要素を取り出せます。
さらに分割してキーと値に分ける
kv = parts[0].split("=")
key = kv[0] # 'name'
value = kv[1] # 'Taro'
Pythonこのように、
- 一度分割して大きなかたまりに分け
- さらに分割して細かい要素に分ける という段階的な分解がよく使われます。
深掘り:分割→リスト→再分割の流れ
文字列の分割は、
- 大きな区切り(
;や,)で分ける - 各要素をさらに細かく分ける(
=など) という二段階で考えると整理しやすいです。
設定文字列、クエリ文字列、ログの1行などは、 このパターンで解析することが多くなります。
分割数を制限する:maxsplit を使う
左側から指定回数だけ分割する
line = "a=b=c=d"
parts = line.split("=", 1)
print(parts) # ['a', 'b=c=d']
Pythonsplit(区切り文字, maxsplit) のように、 2番目の引数で「最大分割回数」を指定できます。
この例では、
- 最初の
=だけで分割し - 左側と右側に分けて
- 右側はそのまま残しています。
もう少し複雑な例
line = "level=INFO message=system started"
parts = line.split(" ", 1)
print(parts) # ['level=INFO', 'message=system started']
Pythonログの先頭部分だけを分けて、残りをまとめて扱いたいときなどに便利です。
深掘り:maxsplit のメリット
- 「最初の1回だけ分割したい」
- 「前半と後半に分けたい」
- 「残りはそのまま1つの文字列として扱いたい」
といった場面で、 「分割しすぎない」ための制御 ができるのが maxsplit の強みです。
行単位で分割する:splitlines()
splitlines() の基本
text = "1行目\n2行目\n3行目"
lines = text.splitlines()
print(lines) # ['1行目', '2行目', '3行目']
Pythonsplitlines() は、
- 改行文字(
\nや\r\n)を区切りとして - 行ごとに分割したリスト を返します。
ファイルの内容やログを「行単位」で扱いたいときに非常に便利です。
改行を含む複数行テキストの処理
text = """ERROR: something failed
WARN: something is slow
INFO: system started"""
lines = text.splitlines()
for line in lines:
print(line)
Pythonこのように、
- 文字列全体を行に分け
- 各行をループで処理する という形で、ログ解析やテキスト処理が書きやすくなります。
よくある用途別の分割パターン
1. CSV形式の1行を分割する
line = "Taro,20,Tokyo"
cols = line.split(",")
name = cols[0]
age = cols[1]
city = cols[2]
Python簡易的なCSV処理なら、split(",") で十分なことも多いです。 ただし、実務ではカンマを含む値などもあるため、専用ライブラリ(csv モジュール)を使うことが推奨されます。
2. URLを分割してパス要素を取り出す
url = "https://example.com/path/to/page"
parts = url.split("/")
print(parts) # ['https:', '', 'example.com', 'path', 'to', 'page']
domain = parts[2]
path_parts = parts[3:]
PythonURLを / で分割することで、
- プロトコル
- ドメイン
- パス要素 をそれぞれ扱えるようになります。
3. ログのレベルとメッセージを分ける
log = "ERROR: disk is full"
level, message = log.split(": ", 1)
print(level) # ERROR
print(message) # disk is full
Python": " を区切り文字にし、maxsplit=1 で分割することで、 ログのレベルとメッセージを簡潔に分けられます。
セキュリティと品質の観点から見た「分割」の注意点
1. 想定通りの形式でない入力への備え
line = "name=Taro"
parts = line.split("=")
if len(parts) != 2:
print("形式が不正です")
else:
key, value = parts
Python外部からの入力は、
- 区切り文字が足りない
- 余計な区切り文字がある
- そもそも形式が違う といったことがよくあります。
そのため、 「分割後の要素数を必ず確認する」 という防御的な書き方が重要です。
2. 危険なデータを見逃さない
query = "SELECT * FROM users; DROP TABLE users;"
parts = query.split(";")
for part in parts:
if "DROP TABLE" in part:
print("危険なクエリです")
Python分割によって文字列を小さくしてしまうと、
- 本来検出すべき危険なパターンを
- 別の要素に分散させてしまう 可能性があります。
セキュリティチェックでは、
- 分割前の全体
- 分割後の各要素 両方を意識して設計することが大切です。
3. 予期せぬ空文字列の扱い
line = "apple,,orange"
items = line.split(",")
print(items) # ['apple', '', 'orange']
Python区切り文字が連続している場合、 空文字列 "" が要素として現れます。
これをそのまま有効な値として扱うと、
- 入力チェックの抜け
- 想定外のデータ につながることがあります。
必要に応じて、
- 空文字列を除外する
- 空文字列をエラーとする といったルールを設けることが重要です。
分割のテンプレートと練習用コード
基本的な分割テンプレート
line = "apple,banana,orange"
items = line.split(",")
Python区切り文字省略(空白で分割)テンプレート
text = "Python で 文字列 を 分割 します"
words = text.split()
Pythonmaxsplit を使ったテンプレート
log = "WARN: memory usage is high"
level, message = log.split(": ", 1)
Python行単位分割テンプレート
text = "line1\nline2\nline3"
lines = text.splitlines()
Python防御的な分割テンプレート
def parse_kv(line):
parts = line.split("=")
if len(parts) != 2:
return None, None
return parts[0], parts[1]
Pythonまとめ
- 文字列の分割には
str.split()が基本であり、区切り文字を指定することで柔軟にリストへ分解できます。 - 区切り文字を省略すると、空白文字をまとめて区切りとして扱い、単語分割に便利です。
maxsplitを使うことで、「分割しすぎない」制御ができ、前半と後半に分けるような処理が書きやすくなります。- 行単位の分割には
splitlines()が適しており、ログやテキストの解析に役立ちます。 - 分割後の要素数や空文字列の扱いをきちんと設計しないと、バグやセキュリティ上の問題につながるため、防御的なチェックをセットで考えることが重要です。
文字列の分割は、データ解析・設定処理・ログ処理・セキュリティチェックなど、実務のあらゆる場面で使われる基礎技術です。 ここを丁寧に押さえておくことで、Pythonでの文字列操作が一段と実践的で信頼できるものになっていきます。
