[解決!Python]文字列中でエスケープシーケンスを使うには解決!Python

文字列に特殊な文字を含めるにはエスケープシーケンスを使用する。代表的なエスケープシーケンスの使用例を紹介する。

» 2024年02月20日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

# 文字列に改行を含めたい
s = 'hello\nworld'
print(s)
# 出力結果:
#hello
#world

# 文字列を途中で改行するが、それ自体は無視したい
s = "hello \
world"
print(s)  # hello world

s = "hello\
     world"
print(s)  # hello     world

# シングルクオート文字列内でダブルクオート文字を使うならエスケープは不要
s = 'abc"def'
print(s)  # abc"def

# ダブルクオート文字列内でシングルクオート文字を使うならエスケープは不要
s = "abc'def"
print(s)  # abc'def

s = 'abc\'def'
print(s)  # abc'def

s = "abc\"def"
print(s) # abc"def

s = '''abc'def'''
print(s)  # abc'def

s = """abc"def"""
print(s)  # abc"def

# タブ位置で文字をそろえて出力
users = [
    {'id':'0001', 'name': 'isshiki'},
    {'id': '12345', 'name': 'kawasaki'}
]

for user in users:
    print(f'{user['id']}: {user['name']}')
# 出力結果:
#0001: isshiki
#12345: kawasaki

users = [
    {'id':'0001', 'name': 'isshiki'},
    {'id': '12345', 'name': 'kawasaki'}
]

for user in users:
    print(f'{user['id']}:\t{user['name']}')
# 出力結果:
#0001:   isshiki
#12345:  kawasaki

# \oooの使用例
cp = ord('c')
tmp = f'{cp:o}'
print(tmp)  # 143

s = f'ab\143'
print(s)  # abc

# \xhhの使用例
cp = ord('z')
tmp = f'{cp:x}'
print(tmp)  # 7a

s = 'xy\x7a'
print(s)  # xyz

# Unicodeデータベースで名前が付けられている文字を出力
s = '\N{COPYRIGHT SIGN}'
print(s)  # ©

s = '\u3042\u3044'
print(s)  # あい

s = '\U00002122'
print(s)  # TM


エスケープシーケンス 説明 備考
\<newline> \と続く改行文字が無視される 文字列中で1行を複数行に分けて記述する際などに使用する
\\ バックスラッシュ文字(\)を表す  
\' シングルクオート文字(')を表す シングルクオート文字列内でシングルクオート文字を使う際などに使用する。例:print('abc\'def')→abc'def
\" ダブルクオート文字(")を表す ダブルクオート文字列内でダブルクオート文字を使う際などに使用する。例:print("abc\"def")→abc"def
\a ビープ音を発生する(BEL文字)  
\b バックスペース(BS文字)  
\f フォームフィード(FF文字)  
\n 改行文字(LF文字)  
\r 復帰文字(CR文字)  
\t 水平タブ文字(TAB文字)  
\v 垂直タブ文字(VT文字)  
\ooo 8進数値oooをコードポイントとする文字 最大3桁まで(ただし、8進数値「0o377」=10進数値「255」より大きな値を指定すると警告または例外が発生する)。例:print('ab\143')→abc
\xhh 16新数値hhをコードポイントとする文字 2桁の16進数値のみを受け取る。例:print('xy\x7a')→xyz
\N{name} Unicodeでnameという名前が付けられている文字 例:print('\N{COPYRIGHT SIGN}')→©
\uxxxx 16ビットの16進数値xxxxをコードポイントとする文字 例:print('\u3042\u3044')→あい
\Uxxxxxxxx 32ビットの16進数値xxxxxxxxをコードポイントとする文字 例:print('\U00002122')→TM
Pythonでサポートされるエスケープシーケンス

Pythonでサポートされるエスケープシーケンス

 Pythonでは文字列内(もしくはバイト列内)で上記のエスケープシーケンスがサポートされる(ただし、本記事内ではバイト列についての話は省略する)。

 エスケープシーケンスはバックスラッシュ「\」で始まり、シングルクオートやダブルクオートの前にrが付くraw文字列(r'abc'など)以外の文字列では上記の表にように解釈される。例えば、文字列内に含まれる「\n」が改行(行送り)として解釈されたり、「\t」がタブ文字として解釈されたりするのは多くの方がご存じで、実際に使っているはずだ。

 以下ではこれらのエスケープシーケンスの中から幾つかを取り上げて紹介していこう。

文字列中に改行を挿入する:\n

 1つの文字列の中に改行を含めたいときには「\n」を使う。

s = 'hello\nworld'
print(s)
# 出力結果:
hello
world


 これに対して、改行を途中に入れたくはないが、文字列の内容がとても長いときなどにコードが見やすくなるように途中に改行を入れて、コード的にはそれを無視したいのであれば「\<newline>」を使用できる。

文字列を途中で改行するが、それ自体は無視したい:\<newline>

 \<newline>はそのまま「\<newline>」と入力するのではなく、文字列中で行末にバックスラッシュを置き、直後に改行し、次行から文字列の続きを記述することを意味する。以下に例を示す(文字列の内容が短いがこれはサンプルなのでご容赦いただきたい)。

s = "hello \
world"
print(s)  # hello world


 この場合、バックスラッシュと直後の改行文字は無視されて、複数行に記述された文字列が改行を含まない1行の文字列のようにして扱われる。気を付けるべきは、インデントを付けて見栄えを良くしようと以下のように書くと、インデントを形成する空白文字も文字列の内容として扱われる点だ。

s = "hello\
     world"
print(s)  # hello     world


文字列中でクオート文字を使用する:\'、\"、トリプルクオート文字列

 文字列中でシングルクオート文字を使いたいのであれば、ダブルクオート文字列を使う。逆にダブルクオート文字を文字列に含めたいのであれば、シングルクオート文字列を使う。

# シングルクオート文字列内でダブルクオート文字を使うならエスケープは不要
s = 'abc"def'
print(s)  # abc"def

# ダブルクオート文字列内でシングルクオート文字を使うならエスケープは不要
s = "abc'def"
print(s)  # abc'def


 だが、何らかの理由でそうはできないこともあるかもしれない。シングルクオート文字列内でシングルクオート文字を使うときには「\'」を、ダブルクオート文字列内でダブルクオート文字を使うなら「\"」を使用する。

s = 'abc\'def'
print(s)  # abc'def

s = "abc\"def"
print(s) # abc"def


 あるいはトリプルクオート文字列を使ってもよい。

s = '''abc'def'''
print(s)  # abc'def

s = """abc"def"""
print(s)


 トリプルクオート文字列では、それを始めるのに使った「’’’」または「"""」が登場するまでの内容が全てそのまま文字列の内容として扱われるので、単独のシングルクオート文字やダブルクオート文字はそのまま記述できる(改行文字も含められる)。

タブ位置をそろえて文字列を出力する:\t

 文字列を出力する際に、タブ位置で文字をそろえて出力したいことがある。例えば、以下の例を見よう。

users = [
    {'id':'0001', 'name': 'isshiki'},
    {'id': '12345', 'name': 'kawasaki'}
]

for user in users:
    print(f'{user['id']}: {user['name']}')
# 出力結果:
#0001: isshiki
#12345: kawasaki


 出力結果を見ると、'id'の桁が違うため、少し表示がずれているのが気になる。このようなときにはタブ位置をそろえて名前を出力すると見栄えが良くなる。

users = [
    {'id':'0001', 'name': 'isshiki'},
    {'id': '12345', 'name': 'kawasaki'}
]

for user in users:
    print(f'{user['id']}:\t{user['name']}')
# 出力結果:
#0001:   isshiki
#12345:  kawasaki


 さらに出力をキレイにするのであれば、書式指定子などを使って文字列のフォーマットを指定するのがよい。

コードポイントを指定して特定の文字を出力したい

 Unicodeのコードポイントを指定して特定の文字を出力するには以下のエスケープシーケンスを使用できる。

  • \ooo:8進数値oooをコードポイントとする文字
  • \xhh:16進数値hhをコードポイントとする文字
  • \N{name}:Unicodeでnameという名前が付けられている文字
  • \uxxxx:16ビットの16進数値xxxxをコードポイントとする文字
  • \Uxxxxxxxx:32ビットの16進数値xxxxxxxxをコードポイントとする文字

 「\ooo」はバックスラッシュに続けてそのまま8進数値を記述する(整数値を8進数として表記するときには「0o123」のような記述になるが、エスケープシーケンス内では「\123」のような記述になる)。また、10進数値で255(8進数値で\377)を超える8進数値は指定できない。

 以下に例を示す。

cp = ord('c')
tmp = f'{cp:o}'
print(tmp)  # 143

s = f'ab\143'
print(s)  # abc


 この例では、まず文字'c'のコードポイントを取得して、その8進表現を調べている。その結果は「143」なので、最後の2行で「ab\143」とエスケープシーケンスを用いた文字列を作成して、それを出力すると、結果は「abc」となった。

 「\xhh」は「\x」に続けて2桁の16進数値を指定する(つまり、こちらも10進数値で255を超える値は指定できない)。

 以下に例を示す。

cp = ord('z')
tmp = f'{cp:x}'
print(tmp)  # 7a

s = 'xy\x7a'
print(s)  # xyz


 この例では先ほどと同様に文字'z'のコードポイントの16進表現を調べてから、「\x」に続けてその値を記述した文字列「'xy\7a'」を作成している。それをprint関数で出力すると、結果は「xyz」となる。

 Unicodeデータベースで名前が付けられている文字を指定して出力するには「\N{name}」を使用する。どんな名前があるかはUnicode Consortiumが公開しているUnicode Character Name Indexなどで調べられる。

 以下に例を示す。

s = '\N{COPYRIGHT SIGN}'
print(s)  # ©


 この例では「\N{COPYRIGHT SIGN}」のように著作権マーク(©)に付けられた名前「COPYRIGHT SIGN」を指定して文字を表示している。

 最後に「\uxxxx」と「\Uxxxxxxxx」だが、前者は4桁の16進数値を受け取り対応するコードポイントの文字を表し、後者は8桁の16進通知を受け取り対応するコードポイントの文字を表す。

 以下に例を示す。

s = '\u3042\u3044'
print(s)  # あい

s = '\U00002122'
print(s)  # TM


 最初の例では’\u3042\u3044'と2文字を含む文字列を作成し、出力している(結果は「あい」。次の例では'\U00002122'と8桁の16進数値を含む文字列を作成し、出力している(その結果はTMである。ただし、本サイトの表記の都合により、ここでは単純な上付き文字としてこれを表現している)。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。