Llama-2が登場!8bit+LoRAでRLHFファインチューニングを試す方法はこちら

【Python】文字列の分割方法|split(), partition(), rsplit(), splitlines(), re.split()

Pythonには文字列を分割するためのさまざまな方法があります。今回は、split()partition()rsplit()splitlines()、およびre.split()という5つのメソッドを紹介します。これらのメソッドを使うことで、文字列を簡単に分割して、必要な部分だけを取り出すことができます。

  • split(): 指定した区切り文字で文字列を分割します。区切り文字を省略すると、空白文字(スペース、タブ、改行)で分割されます。
  • partition(): 指定した文字列で文字列を分割し、3つの部分に分けます。具体的には、分割する文字列の前半、分割する文字列、そして分割する文字列の後半の3つに分けます。
  • rsplit(): split()と似ていますが、後ろから文字列を分割します。
  • splitlines(): 改行文字で文字列を分割します。
  • re.split(): 正規表現を使って文字列を分割します。

これらのメソッドを使うことで、文字列を効率的に分割して、必要な部分だけを取り出すことができます。

では、実際にこれらのメソッドを使って文字列を分割する方法を見ていきましょう。

目次

split()

組み込み型 str.split()— Python 3.11.0b5 ドキュメント

Pythonのsplit()は文字列を分割してリストに格納します。

例えば、ある文字列が「スライムが50匹います。」という文字列だったとします。この文字列を「スライムが」と「匹います。」に分割したい場合、次のようにコードを書くことができます。

# 文字列を定義します
text = "スライムが50匹います。"

# split()を使って文字列を分割します
parts = text.split("50")

# 分割された文字列を表示します
print(parts)

このコードを実行すると、次のような出力が得られます。

["スライムが", "匹います。"]

split()は、第1引数に区切り文字を指定します。

この区切り文字を使って文字列が分割されます。

上の例では、区切り文字に50を指定しています。

このため、「スライムが」と「匹います。」の部分が分割されました。

また、split()は第2引数を指定することで、分割する回数を制限することができます。

例えば、次のようにすると、文字列を最大1回だけ分割することができます。

# 文字列を定義します
text = "スライムが50匹います。ゴブリンも50匹います。"

# split()を使って文字列を分割します
parts = text.split("50", 1)

# 分割された文字列を表示します
print(parts)

このコードは、文字列textを文字列50で分割することを目的としています。split()メソッドは、文字列を指定された区切り文字で分割し、その結果をリストとして返します。

この場合、textの先頭から50が最初に出現する位置までの文字列を最初の要素として返し、残りの文字列を2番目の要素として返すようになっています。split()の第2引数に1が指定されているため、最初に見つかった区切り文字だけで分割を行い、その結果をリストとして返します。

したがって、このコードの実行結果は次のようになります。

["スライムが", "匹います。ゴブリンも50匹います。"]

partition()

組み込み型 str.partition()— Python 3.11.0b5 ドキュメント

str.partition(sep) メソッドは、文字列 strsep で区切って、3 つの部分に分割します。具体的には、sep が最初に出現する位置を境界として、str を以下の 3 つの部分に分割します。

  1. sepより前の部分
  2. sep自身
  3. sepより後の部分

分割された 3 つの部分は、タプルで返されます。

例えば、文字列 'Hello World' を空白で区切る場合は、次のようにします。

'Hello World'.partition(' ')
('Hello', ' ', 'World')

文字列を区切る境界文字sepが文字列中に含まれていない場合、タプルの 2 つ目の要素は空文字列になります。

'HelloWorld'.partition(' ')
('HelloWorld', '', '')

rsplit()

組み込み型 str.rsplit()— Python 3.11.0b5 ドキュメント

rsplit()という関数を使うと、文字列を右から左に向かって分割することができます。

使い方は、次のようになります。

text = "apple, orange, grape"
result = text.rsplit(", ")
print(result) # ['apple', 'orange', 'grape']

また、次のように指定すると、分割する回数を2回に指定することができます。

string = "apple, orange, grape, watermelon"
result = string.rsplit(", ", 2)
print(result) # ['apple, orange', 'grape', 'watermelon']

このように、rsplit()を使うことで、文字列を右から左に向かって分割することができます。区切り文字や分割する回数を指定することで、より細かいカスタマイズができます。

splitlines()

組み込み型 str.splitlines()— Python 3.11.0b5 ドキュメント

文字列を行単位で分割するには、Pythonにはsplitlines()という関数が用意されています。

この関数は、改行文字を区切り文字として、文字列を行単位で分割してリストにします。

改行文字として、次のようなものがあります。

  • \n: UNIX/Linux/MacOSで使われる改行文字。
  • \r: MacOSで使われる改行文字。
  • \r\n: Windowsで使われる改行文字。

使い方は非常に簡単で、以下のようにします。

# 文字列を定義
text = "line1\nline2\nline3"

# splitlines()を使って行単位で分割
lines = text.splitlines()

# 分割された文字列を表示
print(lines) # ['line1', 'line2', 'line3']

splitlines()メソッドには、引数keependsがあります。

この引数をTrueにすると、改行文字も含めて分割されるようになります。

次のように、keepends引数を使って分割することができます。

# 文字列を定義
s = "line1\nline2\rline3\r\nline4"

# splitlines()メソッドを使って分割
lines = s.splitlines(keepends=True)
print(lines) # ['line1\n', 'line2\r', 'line3\r\n', 'line4']

re.split()

re — 正規表現操作 — Python 3.11.0b5 ドキュメント

re.split()は、正規表現を使用して文字列を分割することができます。

以下にいくつかの使用例を示します。

文字列をスペースで分割する

import re

string = "This is a simple string"
result = re.split(r'\s', string)
print(result) # ['This', 'is', 'a', 'simple', 'string']

文字列をカンマで分割する

import re

string = "1,2,3,4,5"
result = re.split(r',', string)
print(result) # ['1', '2', '3', '4', '5']

文字列を数字で分割する

import re

string = "123456"
result = re.split(r'\d', string)
print(result) # ['', '', '', '', '', '', '']

文字列を特定の文字列で分割する

import re

string = "This is a simple string"
result = re.split(r'simple', string)
print(result) # ['This is a ', ' string']

おまけ

上記のメソッドを使わずに文字列を分割するコードもみていきます。

メソッドを使わないコード1

string = "This is a string"
parts = []

# 処理中の単語を保存する変数
current_part = ""

# 文字列を1文字ずつ処理する
for ch in string:
    # 分割文字を発見した場合
    if ch == " ":
        # 分割された文字列をリストに追加する
        parts.append(current_part)
        # current_part を初期化する
        current_part = ""
    else:
        # 分割文字でない場合は、現在の文字を current_part に追加する
        current_part += ch

# 最後の単語を追加する
parts.append(current_part)

print(parts)  # ['This', 'is', 'a', 'string']

処理の流れを簡単に説明します。

  1. 変数 string には、分割したい文字列 This is a stringを代入します。また、空のリスト parts を用意し、分割された文字列を保存するために使用します。
  2. 変数 current_part を定義し、初期値として空文字を代入します。この変数は、処理中の単語を保存するために使用します。
  3. string 変数を 1 文字ずつ処理するために、for ループを使用します。各文字は、変数 ch に代入されます。
  4. 各文字を処理する際に、分割文字である空白文字を発見した場合には、変数 current_part に保存された単語をリスト parts に追加します。また、変数 current_part を初期化し、次の単語の処理を行うために、空文字を代入します。
  5. 分割文字でない場合には、変数 current_part に現在の文字を追加します。これにより、処理中の単語を保存することができます。
  6. 最後に、処理が完了した後に、変数 current_part に保存された最後の単語をリスト parts に追加します。
  7. 最後に、リスト parts を出力します。出力結果は、[‘This’, ‘is’, ‘a’, ‘string’] となります。

上記の方法では、文字列を 1 文字ずつ処理しているため、処理速度は若干遅くなりますが、メソッドを使用せずに文字列を分割することができます。

メソッドを使わないコード2

string = "This is a string"
parts = []

# 現在処理中の文字列の開始インデックス
start_index = 0

# 文字列を1文字ずつ処理する
for i, ch in enumerate(string):
    # 分割文字を発見した場合
    if ch == " ":
        # start_indexからiまでの文字列を取り出す
        parts.append(string[start_index:i])
        # start_indexを更新する
        start_index = i + 1

# 最後の単語を追加
parts.append(string[start_index:])

print(parts)  # ['This', 'is', 'a', 'string']
  1. 変数 string には、分割したい文字列 “This is a string” を代入します。また、空のリスト parts を用意し、分割された文字列を保存するために使用します。
  2. 変数 start_index を定義し、初期値として 0 を代入します。この変数は、現在処理中の文字列の開始インデックスを保存するために使用します。
  3. string 変数を 1 文字ずつ処理するために、for ループを使用します。各文字は、変数 ch に代入されます。また、enumerate 関数を使用することで、文字のインデックスも取得できます。
  4. 各文字を処理する際に、分割文字である空白文字を発見した場合には、start_index から現在の文字のインデックス i までの文字列を、リスト parts に追加します。また、start_index を更新し、次の単語の処理を行うために、現在の文字のインデックス i+1 を新しい start_index として設定します。
  5. 分割文字でない場合には、何もしません。
  6. 最後に、処理が完了した後に、最後の単語をリストに追加して、文字列の分割が完了します。最後の単語は、start_index から文字列の終端までの文字列として取り出します。
  7. 最後に、リスト parts を出力します。出力結果は、[‘This’, ‘is’, ‘a’, ‘string’] となります。

上記のコードでは、文字列を 1 文字ずつ処理するのではなく、分割したい文字列をスライスして取り出しています。このため、処理速度は前述の方法よりも速くなります。

とはいっても無難にメソッドを使った方がいいと思います。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次