文字列操作は、熟練した Python 開発者にとって、特に CSV やログ、乱雑なテキストなどの実際のデータを扱う場合には不可欠です。スペースで分割したい場合もあれば、カスタムの区切り文字を処理したり、文字列の一部だけを簡単に取得したりする必要がある場合もあります。Python には、これらすべてを行うための優れたツールセットがあり、ほとんどの人が使い慣れていると思いますがstr.split()
、特に状況が複雑になったときに、作業を楽にするトリックやその他の関数がたくさんあります。このガイドでは、文字列を分割する 9 つの方法について詳しく説明します。これにより、次に奇妙なテキストを解析したり、適切なデータ チャンクが必要になったときに、不意を突かれることはありません。ステップバイステップの例、ユース ケース、および実際の乱雑な状況に基づいたヒントが期待できます。
公式 API については
str.split
、docs.python.orgをご覧ください。
Pythonで文字列を分割する方法 – 実際に使えるいくつかの方法
空白で分割str.split()
デフォルトでは、split()
引数なしで呼び出すだけで、空白文字(スペース、タブ、改行など)をスライスします。テキストがそれほど構造化されていないものの、個々の単語やトークンを取得したい場合に、素早くクリーンアップするのに非常に便利です。
s = "Python makes text processing easier" parts = s.split() print(parts) # ['Python', 'makes', 'text', 'processing', 'easier']
かなり簡単です。場合によっては、次のように分割結果を再利用のために保存したいこともあります。
words = s.split() print(words[0]) # Python
一部の設定では、特に文字列の先頭または末尾にスペースがある場合、奇妙な動作をすることがありますので注意してください。
特定の区切り文字を使用して分割する
テキストが CSV のように明確な区切りで構成されている場合には、split()
区切り文字を使用すると便利です。
csv = "Alice, Bob, Charlie" names = csv.split(", ") print(names) # ['Alice', 'Bob', 'Charlie']
タブについても同様です。
tsv = "2\tapple juice\t2.00" fields = tsv.split("\t") print(fields) # ['2', 'apple juice', '2.00']
不規則な区切り文字や複数の文字を扱う場合も、この方法は有効です。ただし、データの不一致には注意してください。時々、問題が発生することがあります。
分割回数を制限するmaxsplit
これは、文字列を1、2回だけ分割したい場合、つまり無数の断片に分割したくない場合に便利です。例えば、ログエントリの最初の数個だけを取得したい場合などです。
log = "2025-01-15 08:45:23 INFO User logged in" date, time, level, message = log.split(maxsplit=3) print(date, time, level, message) # '2025-01-15' '08:45:23' 'INFO' 'User logged in'
あるいは:
"A B C".split(maxsplit=1) # ['A', 'B C']
これは、文字列の最初の部分だけに興味がある場合に、整理整頓を保つのに役立ちます。
右から分割してrsplit()
場合によっては、パスからファイル名を抽出する場合のように、文字列の最後の部分が最も重要になります。rsplit()
最後から分割することで目的を達成します。
path = "/home/user/docs/tax.txt" directory, filename = path.rsplit("/", maxsplit=1) print(directory) # /home/user/docs print(filename) # tax.txt
これは、最後のセクションが変化するファイル パスまたは URL を解析するときに特に便利です。
partition()
セパレーターを付属し、シングルスプリットに使用
最初の区切り文字だけが重要な場合は、partition()
文字列を、その前の部分、区切り文字自体、そして残りの部分を含むタプルに分割します。最初のチャンクだけを取得するには、簡潔で信頼性の高い方法です。
s = "abcd qwrre qwedsasd zxcwsacds" head, sep, tail = s.partition(" ") print(head) # abcd print(tail) # qwrre qwedsasd zxcwsacds
とは異なりsplit(maxsplit=1)
、これは、見つかった場合はセパレータを含む 3 部構成のタプルを常に返します。
行に分割splitlines()
複数行のテキスト、ログ、改行を含むユーザー入力を処理するのに最適です。大きなテキストブロックを行のリストに変換するのが簡単になります。
text = "Hello\nHow are you?\n" lines = text.splitlines() print(lines) # ['Hello', 'How are you?']
行末を残しておきたい場合は、splitlines(keepends=True)
そうします。理由はよく分かりませんが、後続の処理のために改行を保存しておく必要がある場合もあります。
正規表現の分割にジャンプするにはre.split()
ここからが少し複雑になります。複数の奇妙な区切り文字、スペース、パターンで分割する必要がある場合は、re モジュールが役立ちます。
import re data = "Apple:Orange|Lemon-Date" parts = re.split(r"[:|-]", data) print(parts) # ['Apple', 'Orange', 'Lemon', 'Date']
複数の区切り文字を含む複雑なデータを一度に処理したいですか?問題ありません。複数の区切り文字と空白文字を含む例を以下に示します。
messy = "Apple :::::3:Orange | 2|||Lemon --1 AND Date :: 10" pattern = r"\s*(?:[:|\-]+|AND)\s*" print(re.split(pattern, messy)) # ['Apple', '3', 'Orange', '2', 'Lemon', '1', 'Date', '10']
覚悟してください。正規表現は混乱を招く可能性がありますが、正しく使用すれば強力です。
簡単に文字に分割
個々の文字が必要ですか?文字列をリストに変換するだけです。
chars = list("foobar") print(chars) # ['f', 'o', 'o', 'b', 'a', 'r']
シンプルですが、文字レベルの処理や比較を行う場合に非常に便利です。
複数行を単語に分割する
複数行のテキストを扱っていて、長い単語リストを作成したい場合は、ループ処理やリスト内包表記を使うと便利です。例えば、
book_lines = ["the history of", "australian exploration from 1788 to 1888"] words = [] for line in book_lines: words.extend(line.split()) print(words) # ['the', 'history', 'of', 'australian', 'exploration', 'from', '1788', 'to', '1888']
あるいは短い一言:
words = [w for line in book_lines for w in line.split()]
現実世界でのものです。テキストをトークン化するのに非常にうまく機能します。
文字列分割の簡単なヒント
split()
新しいリストを作成します。文字列はそのまま残ります (結局のところ、文字列は不変です)。- 常に出力を割り当ててください:
tokens = s.split()
。そうしないと、コードを無駄にするだけです。 split("\t")
TSV データを扱うときに使用します。- 文字列の最初の部分だけが必要な場合、
partition()
またはsplit(maxsplit=1)
よりクリーンなオプションが必要な場合。 - ファイルパスをお探しですか?
rsplit()
末尾のファイル名の抽出に非常に役立ちます。 - 複数行の入力を処理しますか?
splitlines()
助けになります。
まとめ
Pythonの文字列分割ツールボックスは実に多用途です。CSVやログの解析、あるいはユーザー入力のクリーンアップなど、どんな用途でも、たいていは作業を容易にするメソッドや関数が用意されています。これらのテクニックを実践することで、コードはより効率的でクリーンになり、複雑なテキストパターンを扱う際のストレスを軽減できます。これらのテクニックは、特に乱雑で予測不可能なデータソースを扱う際に、多くの頭痛の種を軽減してくれるでしょう。
まとめ
- 単純な空白の分割や CSV などの構造化データに使用します
split()
。 - パス内のファイル名などの末尾の部分を選択します
rsplit()
。 partition()
1 ショットの分割にのみ使用- 便利で明確です。splitlines()
複数行のブロック、ログ、またはユーザー入力に機能します。- 正規表現は、 re.split()を使用した複雑な区切り文字に役立ちます。
- で文字に分割します
list()
。 - 複数行を処理しますか?
split()
理解範囲内で行をループします。
まとめ
正直なところ、これらの手法をマスターすれば、実際の複雑なデータを扱う際に大きな違いが生まれます。すべての分割が単純なわけではなく、正規表現や複数のテクニックの組み合わせが必要になることもあります。これらの手法に慣れれば、テキスト処理用のPythonスクリプトの作成がはるかに楽になります。難しい文字列の解析、頑張ってください。きっとうまくいきますよ。