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()
を実行すると各出力結果が改行されて表示される。
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
で指定するより元の文字列を連結したほうが楽。以下の記事を参照。