Pythonで改行を含む文字列の出力、連結、分割、削除、置換

Modified: | Tags: Python, 文字列

Pythonにおける改行を含む文字列の生成・出力、および、改行コードの削除・置換などについて説明する。

改行を含む文字列を作成、print出力(表示)

改行コード \n(LF), \r\n(CR+LF)

文字列内に改行コード\n\r\nを挿入すると改行される。

s = 'Line1\nLine2\nLine3'
print(s)
# Line1
# Line2
# Line3

s = 'Line1\r\nLine2\r\nLine3'
print(s)
# Line1
# Line2
# Line3

Macを含むUnix系では\n(LF)、Windows系では\r\n(CR+LF)が改行コードとして使われる。エディタによっては改行コードを選択できるものもある。

トリプルクォート ''', """

トリプルクォート'''または"""で囲むと改行も含めてそのままの文字列となる。

s = '''Line1
Line2
Line3'''
print(s)
# Line1
# Line2
# Line3

インデントを付けたい場合

トリプルクォートはスペースもそのまま文字列となるので、コード上でキレイに書こうとして以下のようにインデントを入れると不要なスペースが挿入されてしまう。

s = '''
    Line1
    Line2
    Line3
    '''
print(s)
# 
#     Line1
#     Line2
#     Line3
#     

バックスラッシュ\を使ってコード中の改行を無視して継続行とすることで以下のように書ける。

各行を''または""で囲み、文末に改行文字\nを加える。

s = 'Line1\n'\
    'Line2\n'\
    'Line3'
print(s)
# Line1
# Line2
# Line3

ここでは文字列リテラルを連続すると連結されるという文法を利用している。詳細は以下の記事を参照。

文字列中にインデントを加えたい場合は各行の文字列にスペースを加えればOK。

s = 'Line1\n'\
    '    Line2\n'\
    '        Line3'
print(s)
# Line1
#     Line2
#         Line3

また、括弧(())で囲まれている部分では自由に改行できるので、バックスラッシュを使わずに括弧()を使って以下のように書くこともできる。

s = ('Line1\n'
     'Line2\n'
     'Line3')
print(s)
# Line1
# Line2
# Line3

s = ('Line1\n'
     '    Line2\n'
     '        Line3')
print(s)
# Line1
#     Line2
#         Line3

行頭を揃えたいだけならトリプルクォートの最初の行にバックスラッシュ\を加えるだけでもいい。

s = '''\
Line1
Line2
Line3'''
print(s)
# Line1
# Line2
# Line3

s = '''\
Line1
    Line2
        Line3'''
print(s)
# Line1
#     Line2
#         Line3

文字列のリストを改行して連結(結合)

文字列メソッドjoin()を使うと、文字列のリストを一つの文字列に連結(結合)できる。

改行文字\n\r\nからjoin()を呼ぶと文字列要素ごとに改行されて連結される。

l = ['Line1', 'Line2', 'Line3']

s_n = '\n'.join(l)
print(s_n)
# Line1
# Line2
# Line3

print(repr(s_n))
# 'Line1\nLine2\nLine3'

s_rn = '\r\n'.join(l)
print(s_rn)
# Line1
# Line2
# Line3

print(repr(s_rn))
# 'Line1\r\nLine2\r\nLine3'

上の例のように、組み込み関数repr()を使うと改行コードがそのまま含まれた文字列を確認できる。

文字列を改行ごとに分割、リスト化: splitlines()

文字列メソッドsplitlines()で文字列を改行ごとに分割し、リスト化できる。

splitlines()\n(LF: Mac含むUnix系)も\r\n(CRLF: Windows系)も改行コードとして分割する。

s = 'Line1\nLine2\r\nLine3'
print(s.splitlines())
# ['Line1', 'Line2', 'Line3']

\n\r\nのほか、\v(垂直タブ)や\f(改ページ)などでも分割される。

splitlines()についての詳細は以下の記事も参照。

改行コードの削除、置換

splitlines()join()を組み合わせることで、改行を含む文字列から改行コードを削除(除去)したり他の文字列に置換したりすることができる。

s = 'Line1\nLine2\r\nLine3'

print(''.join(s.splitlines()))
# Line1Line2Line3

print(' '.join(s.splitlines()))
# Line1 Line2 Line3

print(','.join(s.splitlines()))
# Line1,Line2,Line3

改行コードの一括変更も可能。改行コードが混在していたり不明であったりする場合でも、splitlines()で分割してから所望の改行コードで連結すればよい。

s_n = '\n'.join(s.splitlines())
print(s_n)
# Line1
# Line2
# Line3

print(repr(s_n))
# 'Line1\nLine2\nLine3'

上述のようにsplitlines()\n(LF: Mac含むUnix系)も\r\n(CRLF: Windows系)も改行として分割してくれるので、splitlines()join()を組み合わせる方法の場合は特に改行コードを気にする必要はない。

改行コードがはっきりしている場合は、文字列を置き換えるreplace()メソッドで改行コードを置換することもできる。

s = 'Line1\nLine2\nLine3'

print(s.replace('\n', ''))
# Line1Line2Line3

print(s.replace('\n', ','))
# Line1,Line2,Line3

ただし、想定と異なる改行コードが含まれているとうまくいかないので注意。

s = 'Line1\nLine2\r\nLine3'

s_error = s.replace('\n', ',')
print(s_error)
# ,Line3Line2

print(repr(s_error))
# 'Line1,Line2\r,Line3'

s_error = s.replace('\r\n', ',')
print(s_error)
# Line1
# Line2,Line3

print(repr(s_error))
# 'Line1\nLine2,Line3'

replace()を繰り返して複数の改行コードを置き換えることもできるが、\r\nには\nが含まれているので順番を間違えるとうまくいかない。上述のsplitlines()join()を組み合わせた方法だと改行コードを気にする必要がないので安全。

s = 'Line1\nLine2\r\nLine3'

print(s.replace('\r\n', ',').replace('\n', ','))
# Line1,Line2,Line3

s_error = s.replace('\n', ',').replace('\r\n', ',')
print(s_error)
# ,Line3Line2

print(repr(s_error))
# 'Line1,Line2\r,Line3'

print(','.join(s.splitlines()))
# Line1,Line2,Line3

文末の改行コードを削除するにはrstrip()メソッドを使う。rstrip()は文字列の右端の空白文字(改行含む)を削除するメソッド。

s = 'aaa\n'
print(s + 'bbb')
# aaa
# bbb

print(s.rstrip() + 'bbb')
# aaabbb

print()関数ではデフォルトで末尾に改行が追加される。このため連続してprint()を実行すると各出力結果が改行されて表示される。

print('a')
print('b')
print('c')
# a
# b
# c

これは末尾に追加する文字列を指定するprint()の引数endのデフォルト値が改行記号'\n'になっているから。

末尾で改行させないようにするには引数endを空文字列''とすればOK。末尾の改行なしで出力される。

print('a', end='')
print('b', end='')
print('c', end='')
# abc

引数endには任意の文字列を指定可能。

print('a', end='-')
print('b', end='-')
print('c')
# a-b-c

ただし、文字列を連結して出力したい場合はprint()endで指定するより元の文字列を連結したほうが楽。以下の記事を参照。

関連カテゴリー

関連記事