Pythonによる文字列の分割: 区切り文字列、正規表現、改行などによる分割方法を解説

286, 2021-07-08

目次

Pythonによる文字列の分割

Pythonでは文字列(str)のメソッドsplit()を使うと文字列を区切り文字列で分割することが出来ます。
その結果はリストとして取得でき、分割した文字列を扱うことが出来るようになります。

結論から言うと、Pythonによる文字列の分割は↓のようにやります。

s = 'abc,def,ghi'
toks = s.split(',')
print(toks)
# ['abc', 'def', 'ghi']

この記事ではstr.split()を使った文字列の分割方法の他にも、さまざまな文字列の分割方法を解説します。
具体的には↓を見ていきます。

  • str.split()の使い方

  • str.rsplit()の使い方

  • str.splitlines()の使い方

  • str.partition()の使い方

  • str.rpartition()の使い方

  • re.split()の使い方

  • スライスの使い方

str.split()の使い方

文字列(str)を区切り文字で分割するstr.split()の使い方です。

str.split()の構造

split()は↓のような構造を持っています。

str.split(sep=None, maxsplit=-1)

第1引数のsepには分割に使用する区切り文字列を指定します。
第2引数のmaxsplitは最大分割回数です。分割回数を制限したい時に指定します。
split()の返り値はリストで、このリストには分割された文字列が格納されます。

str.split(): 区切り文字列で分割

split()を使って区切り文字列で分割したい場合は、↓のようにします。

s = 'abc,def,ghi'
toks = s.split(',')
print(toks)
# ['abc', 'def', 'ghi']

↑の場合、元になるのはabc,def,ghiという文字列です。
この文字列をsplit()で区切り文字列にカンマ(,)を指定して分割します。
その結果はtoksに保存されます。

区切り文字列は1文字だけでなく、文字列なので複数文字指定できます。

s = 'abc,def,ghi'
toks = s.split(',def,')
print(toks)
# ['abc', 'ghi']

元の文字列が空文字列だった場合は空文字列を含んだリストを返します。

s = ''
toks = s.split(',')
print(toks)
# ['']

空のリストではなく空文字列を含んだリストなのね

分割した文字列の最後の要素にアクセスしたい場合は[-1]を使います。

s = 'abc,def,ghi'
last = s.split(',')[-1]
print(last)
# ghi

str.split(): ブランクで分割

split()に区切り文字列を指定しなかった場合はブランクが分割されます。
ブランクとは半角スペース、改行、タブのことです。

s = 'abc\ndef\tghi jkl'
toks = s.split()
print(toks)
# ['abc', 'def', 'ghi', 'jkl']

str.split(): 分割回数を指定して分割

split()の第2引数に最大分割回数を指定すると、その回数まで分割されます。

s = 'abc,def,ghi'
toks = s.split(',', 1)
print(toks)
# ['abc', 'def,ghi']

↑の場合、分割回数には1を指定しています。
そのためカンマによる分割一回だけ行われて結果が返ってきます。
分割は文字列の左側から右側に向かって行われていくので、↑のような結果になります。

str.rsplit()の使い方

文字列を区切り文字列で右側から分割するstr.rsplit()の使い方です。

str.rsplit()の構造

rsplit()の構造は↓のようになっています。

str.rsplit(sep=None, maxsplit=-1)

rsplit()の第1引数sep、第2引数maxsplitの役割はsplit()の場合と同様です。

str.rsplit(): 区切り文字列で分割

rsplit()も区切り文字で文字列を分割します。

s = 'abc,def,ghi'
toks = s.rsplit(',')
print(toks)
# ['abc', 'def', 'ghi']

↑のように結果はsplit()の場合と同様です。

str.rsplit(): 分割回数を指定して分割

rsplit()の使い道は分割回数を指定した場合にあります。

s = 'abc,def,ghi'
toks = s.rsplit(',', 1)
print(toks)
# ['abc,def', 'ghi']

↑のようにrsplit()は文字列の右側から分割していきます。

str.splitlines()の使い方

str.splitlines()は文字列を改行で分割します。

str.splitlines()の構造

str.splitlines()は↓のような構造になっています。

str.splitlines([keepends])

splitlines()の第1引数keependsTrueが指定されていた場合、分割した結果には改行が含まれます。
splitlines()が分割するのは正確には行境界です。これには垂直タブや改ページなども含まれます。

str.splitlines(): 改行で分割

splitlines()で改行を分割するには↓のようにします。

s = 'abc\rdef\nghi\r\njkl'
toks = s.splitlines()
print(toks)
# ['abc', 'def', 'ghi', 'jkl']

↑のようにsplitlines()LFCR, CR+LFなどの改行を分割することが可能です。
splitlines()の第1引数にTrueを指定すると改行が結果に格納されます。

s = 'abc\rdef\nghi\r\njkl'
toks = s.splitlines(True)
print(toks)
# ['abc\r', 'def\n', 'ghi\r\n', 'jkl']

str.partition()の使い方

最初に見つけた区切り文字から文字列を3つに分割するstr.parition()の使い方です。

str.partition()の構造

str.partition()は↓のような構造を持っています。

str.partition(sep)

partition()は第1引数のsepの区切り文字列で文字列を分割します。
文字列の左側から見ていって最初にsepが現れた時点で「sepの前、sep, sepの後」の3要素に文字列を分割します。
結果はタプルで返ってきます。

str.partition(): 区切り文字列で分割

partition()で文字列を区切り文字列で分割するには↓のようにします。

s = 'abc,def,ghi'
tpl = s.partition(',')
print(tpl)
# ('abc', ',', 'def,ghi')

↑の場合、区切り文字列は,です。結果はabc, ,, def,ghiの3つに分割されます。

str.rpartition()の使い方

str.rpartition()str.partition()とほぼ同じ機能ですが、文字列を右側から見ていく点が違っています。

str.rpartition()の構造

rpartition()は↓のような構造になっています。

str.rpartition(sep)

rpartition()の第1引数はpartition()の場合と同様です。

str.rpartition(): 区切り文字で分割

rpartition()で文字列を区切り文字列で分割するには↓のようにします。

s = 'abc,def,ghi'
tpl = s.rpartition(',')
print(tpl)
# ('abc,def', ',', 'ghi')

↑の場合、区切り文字列は,です。
abc,def,ghiを右側から見ていって最初に,が現れたところで分割しています。

re.split()の使い方

reモジュールのsplit()は正規表現で文字列を分割することが出来ます。

re.split()の構造

re.split()は↓のような構造を持っています。

re.split(pattern, string, maxsplit=0, flags=0)

re.split()の第1引数patternには正規表現パターンを指定します。
第2引数のstringには分割対象の文字列を指定します。
第3引数のmaxsplitには最大分割回数、第4引数のflagsにはフラグを指定します。
re.split()も結果はリストで返します。

re.split(): 正規表現で分割

re.split()で正規表現を指定して文字列を分割するには↓のようにします。

import re


s = 'abc def\tghi'
toks = re.split(r'\s', s)
print(toks)
# ['abc', 'def', 'ghi']

↑の場合、r'\s'というのが正規表現パターンです。これは空白文字にマッチするパターンです。
結果はリストとしてtoksに保存されます。

他には複数の整数にマッチする\d+を使ったパターンもあります。

s = 'abc123def456ghi'
toks = re.split(r'\d+', s)
print(toks)
# ['abc', 'def', 'ghi']

re.split(): 複数の区切り文字列で分割

パターンに[]を使うと複数の区切り文字列にマッチさせることが出来ます。

s = 'abc,def\tghi:jkl'
toks = re.split(r'[,\t:]', s)
print(toks)
# ['abc', 'def', 'ghi', 'jkl']

↑の場合、パターンは[,\t:]です。つまり,\t:のいずれかにマッチするパターンになっています。

スライスの使い方

スライスを使った文字列の分割方法です。

スライス: 文字数で分割する

文字列の先頭4文字を取り出したいときは↓のようにします。

s = 'abcdefghi'
print(s[:4])
# abcd

文字列の先頭4文字以降を取り出したい時は↓のようにします。

s = 'abcdefghi'
print(s[4:])
# efghi

文字列の末尾から4文字取り出したい場合は↓のようにします。

s = 'abcdefghi'
print(s[-4:])
# efghi

先頭4文字目から4文字取り出す時は↓のようにします。

s = 'abcdefghi'
print(s[3:7])
# defg

関連記事
Pythonで文字列抽出【インデックスとスライス】

おわりに

今回はPythonで文字列を分割する方法を見てみました。
文字列の分割は比較的によく行う処理だと思いますが、けっこうバリエーションがあるものですね。

分割払い

分割購入