Pythonで文字列を特定の区切り文字で分割する方法について解説します。
Contents
文字列を特定の区切り文字で分割する方法
Pythonで文字列を特定の区切り文字で分割する場合には、以下のメソッドを使用することができます。
- 特定の区切り文字で分割する方法:split, rsplit
- 改行文字で分割する方法:splitlines
- 特定の区切り文字で2分割する方法:partition, rpartition
以降で各メソッドの使い方について例を用いて紹介します。
文字列を特定の区切り文字で分割する方法 ~ split, rsplit ~
文字列を特定の区切り文字で分割するためには、split, rsplitメソッドを使用します。
前方から文字列を分割する split
前方から文字列を分割する場合には、以下のようにsplitメソッドを使用します。
sample_text1 = 'Python Java C C++ C# Go' sample_text2 = 'Python|Java|C|C++|C#|Go' # ===== 前方から分割する split # 空白文字で分割 print('--- 空白で分割') print(sample_text1.split()) # 指定文字で分割 print('--- 指定文字で分割') print(sample_text2.split('|'))
【実行結果】 --- 空白で分割 ['Python', 'Java', 'C', 'C++', 'C#', 'Go'] --- 指定文字で分割 ['Python', 'Java', 'C', 'C++', 'C#', 'Go']
splitは、引数を省略した場合には空白文字を区切り文字として文字列を分割します。
ここでいう空白文字には半角文字だけではなく全角文字、水平タブ(\t)、垂直タブ(\v)、改行文字(\r, \n)、改ページ(\f)といったものも含んでいる点に注意してください。
また、引数に区切り文字を指定することで任意の区切り文字で分割することも可能です。上記例では、「|」で分割を行っています。
後方から文字列を分割する rsplit
後方から文字列を分割する場合には、以下のようにrsplitメソッドを使用します。
sample_text1 = 'Python Java C C++ C# Go' sample_text2 = 'Python|Java|C|C++|C#|Go' # 空白文字で分割 print('--- 空白で分割') print(sample_text1.rsplit()) # 指定文字で分割 print('--- 指定文字で分割') print(sample_text2.rsplit('|'))
【実行結果】 --- 空白で分割 ['Python', 'Java', 'C', 'C++', 'C#', 'Go'] --- 指定文字で分割 ['Python', 'Java', 'C', 'C++', 'C#', 'Go']
引数の考え方は、splitメソッドと同様です。
splitとrsplitの処理結果が変わる場合
上記でsplitとrsplitの実行結果を見てきましたが、処理結果は同じでした。splitとrsplitの違いが発生するのは、最大分割数を指定した場合です。
最大分割数は、以下のようにmaxsplitで指定します。
sample_text1 = 'Python Java C C++ C# Go' sample_text2 = 'Python|Java|C|C++|C#|Go' # ===== splitとrsplitの分割結果が変わる場合 # 空白文字で分割 print('--- 空白で分割') print(sample_text1.split(maxsplit=3)) print(sample_text1.rsplit(maxsplit=3)) # 指定文字で分割 print('--- 指定文字で分割') print(sample_text2.split('|', maxsplit=3)) print(sample_text2.rsplit('|', maxsplit=3)) # # 位置引数で指定してもよい # print(sample_text2.split('|', 3)) # print(sample_text2.rsplit('|', 3))
【実行結果】 --- 空白で分割 ['Python', 'Java', 'C', 'C++ C# Go'] ['Python Java C', 'C++', 'C#', 'Go'] --- 指定文字で分割 ['Python', 'Java', 'C', 'C++|C#|Go'] ['Python|Java|C', 'C++', 'C#', 'Go']
上記の例では、最大分割数(maxsplit)として3を指定しています。
この場合は、splitは前方から3つに分割され、残りの文字列はまとめられたままになります。一方で、rsplitは後方から3つ分割されて、残りの文字列はまとめられたままになっています。
また、最大分割数(maxsplit)は区切り文字と合わせて指定する場合には、sample_text2.split('|', 3)のように位置引数として指定しても同じです。(サンプルではコメントアウトしています)
このようにsplitとrsplitでは最大分割数(maxsplit)を指定した時に結果が変わります。
文字列を改行文字で分割する方法 ~ splitlines ~
文章のテキスト等を扱う場合、改行で一文ずつ分割したい時があります。このような場合、改行に特化した分割機能を提供してくれるsplitlinesメソッドを使用するのが便利です。
splitlinesメソッドは、以下の例のように使用します。
sample_text = '''\ Python Java C C++ C# Go ''' # splitlinesにより改行文字で分割する print(sample_text.splitlines()) # 改行文字を含めたまま分割する場合は、引数にTrueを設定する print(sample_text.splitlines(True))
【実行結果】 ['Python', 'Java', 'C', 'C++', 'C#', 'Go'] ['Python\n', 'Java\n', 'C\n', 'C++\n', 'C#\n', 'Go\n']
この例では、各改行ごとに分割できていることが分かります。splitlinesメソッドは、改行文字はデフォルトで除去されます。
もし、改行文字を結果に残したままにしたい場合には、splitlinesの引数にTrueを指定することで改行文字込みで分割ができます。
splitlinesの公式ドキュメントの記載はこちらを参照してください。
文字列を特定の区切り文字で2分割する方法 ~ partition, rpartition ~
split, rsplitメソッドは、文字列中に含まれる区切り文字で文字列を分割しました。文字列を分割する際に、最初に見つかった区切り文字で文字列を2分割をしたい場合には、partition, rpartitionメソッドを使用します。
前方から文字列を2分割する partition
前方から文字列を2分割する場合には、以下のようにpartitionメソッドを使用します。
sample_text = 'samplesite.com/sample.html' # partitionで2分割する print(sample_text.partition('.')) # 区切り文字が見つからない場合 print(sample_text.partition('#'))
【実行結果】 ('samplesite', '.', 'com/sample.html') ('samplesite.com/sample.html', '', '')
partitionメソッドは前方から区切り文字を探し、見つかった位置で文字列を2分割します。メソッドの返り値はタプル形式です。
「区切り文字の前の文字列」「区切り文字」「区切り文字の後の文字列」という3要素からなるタプルとなっていることが分かります。
対象の文字列に区切り文字が見つからなかった場合は、partitionでは最初の要素に元の文字列が設定され、残りの要素は空文字となります。
後方から文字列を2分割する rpartition
後方から文字列を2分割する場合には、以下のようにrpartitionメソッドを使用します。
sample_text = 'samplesite.com/sample.html' # rpartitionで2分割する print(sample_text.rpartition('.')) # 区切り文字が見つからない場合 print(sample_text.rpartition('#'))
【実行結果】 ('samplesite.com/sample', '.', 'html') ('', '', 'samplesite.com/sample.html')
rpartitionメソッドは後方から区切り文字を探し、見つかった位置で文字列を2分割します。メソッドの返り値はタプル形式です。
partitionと同様に「区切り文字の前の文字列」「区切り文字」「区切り文字の後の文字列」という3要素からなるタプルとなっていることが分かります。
対象の文字列に区切り文字が見つからなかった場合は、rpartitionでは3番目の要素に元の文字列が設定され、残りの要素は空文字となります。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。