Python - 文字列

文字列

シングルクォート ' 、またはダブルクォート " で囲むと文字列 (str 型オブジェクト) になります。シングルクォート ' 、またはダブルクォート " のどちらで囲んでも、値としては等価になります。

s_sq = 'abc'
print(s_sq)
# abc

print(type(s_sq))
# <class 'str'>

s_dq = "abc"
print(s_dq)
# abc

print(type(s_dq))
# <class 'str'>

print(s_sq == s_dq)
# True
クォートを使った文字列

ただしどちらのクォートで囲むかによって、文字列中の引用符の扱いが異なります。シングルクォート ' で囲んだ場合、引用符としてダブルクォート " がそのまま使えますが、シングルクォート ' を使う場合はバックスラッシュでエスケープ \' する必要があります。逆にダブルクォート " で囲んだ場合、引用符としてシングルクォート ' がそのまま使えますが、ダブルクォート " を使う場合はバックスラッシュでエスケープ \" する必要があります。

s_sq = 'a\'b"c'
print(s_sq)
# a'b"c

s_sq = 'a\'b\"c'
print(s_sq)
# a'b"c

s_dq = "a'b\"c"
print(s_dq)
# a'b"c

s_dq = "a\'b\"c"
print(s_dq)
# a'b"c
引用符のエスケープ

シングルクォート ' 、またはダブルクォート " を3つ使ったトリプルクォート ''', """ で囲まれた文字列は、複数行をまとめて扱うことができます。トリプルクォートのなかに複数行の文字列を入れると、改行文字、および先頭や末尾にスペースがある場合、それらも残るため注意が必要です。

>>> poem = '''I do not like thee, Doctor Fell.
...     The reason why, I cannot tell.
...     But this I know, and know full well:
...     I do not like thee, Doctor Fell.
... '''
>>> print(poem)
I do not like thee, Doctor Fell.
    The reason why, I cannot tell.
    But this I know, and know full well:
    I do not like thee, Doctor Fell.

>>>
トリプルクォートの文字列

また、print() の出力と、対話型インタープリタが行う自動エコーの出力には違いがあります。対話型インタープリタでは、以下のように改行文字は \n と表示され、複数回繰り返すスペースも省略されます。

>>> poem2
'I do not like thee, Doctor Fell.\n The reason why, I cannot tell.\n
But this I know, and know full well:\n I do not like thee, Doctor
Fell.\n'
トリプルクォートの文字列

シングルクォート ' 、またはダブルクォート " で囲んだ文字列を複数行にした場合、SyntaxError が発生します。ただし、明示的な改行コード \n を文字列内に含めることで改行することができます。

s = 'I do not like thee, Doctor Fell.
The reason why, I cannot tell.
But this I know, and know full well:
I do not like thee, Doctor Fell.'
# SyntaxError: EOL while scanning string literal

s = 'I do not like thee, Doctor Fell.\nThe reason why, I cannot tell.\nBut this I know, and know full well:\nI do not like thee, Doctor Fell.'
print(s)
# I do not like thee, Doctor Fell.
# The reason why, I cannot tell.
# But this I know, and know full well:
# I do not like thee, Doctor Fell.
文字列内の改行

トリプルクォート ''', """ で囲まれた文字列は、シングルクォート ' 、またはダブルクォート "のどちらでも等価になります。

s_tq_sq = '''\'abc\'
"xyz"'''

print(s_tq_sq)
# 'abc'
# "xyz"

s_tq_dq = """'abc'
\"xyz\""""

print(s_tq_dq)
# 'abc'
# "xyz"

print(s_tq_sq == s_tq_dq)
# True
クォートの文字列の等価

また、括弧を使うことで以下のようも記述できます。

s_multi = ('abc\n'
           'xyz')

print(s_multi)
# abc
# xyz
括弧を使った記述

文字列への変換

コンストラクタ str() を使うと他の型のオブジェクトを文字列(str 型オブジェクト)に変換できます。str() は対象オブジェクトの __str()__ 関数の結果を返します。__str()__ 関数が未定義の場合は、repr() 関数の結果を返します。

整数 int や浮動小数点数 floatstr() で文字列 str に変換します。

i = 100

print(str(i))
# 100

print(type(str(i)))
# <class 'str'>

f = 0.123

print(str(f))
# 0.123

print(type(str(f)))
# <class 'str'>
str への変換

str() で文字列 str に変換した場合、16 進数表記の整数 int や、指数表記の float は標準的な書式の文字列に変換されます。

i = 0xFF
print(str(i))
# 255

f = 1.23e+10
print(str(f))
# 12300000000.0
str への変換

文字列を連結・結合する: +演算子

+ 演算子を使って、文字列リテラル ('...', "...") を連結できます。

print('a' + 'b' + 'c')
# abc
文字列の連結・結合

代入演算子の += 演算子も使えます。左辺の文字列変数に右辺の文字列が連結されます。

s = 'abc'
s += 'xxx'

print(s)
# abcxxx
文字列の連結・結合

単純に文字列リテラルを並べて書いてもその文字列リテラルが連結されます。

s = 'a' 'b' 'c'

print(s)
# abc
文字列の連結・結合

ただし、文字列の変数に対しては上記の書き方はできません。

s1 = 'a'
s2 = 'b'
s3 = 'c'
s = s1 s2 s3

print(s)
# SyntaxError: invalid syntax
文字列の連結・結合

異なる型を + 演算子で連結した場合、TypeError が発生します。

s = 'abc'
i = 100

print(s + i)
# TypeError: must be str, not int
異なる型の連結・結合

数値 (整数型 int や浮動小数点型 float) と文字列を + 演算子で連結する場合、数値を str() で文字列に変換してから連結します。

s = 'abc'
i = 100

print(s + str(i))
# abc100
異なる型の連結・結合

文字列のリストを連結・結合する: join()

join() 関数を使うと、文字列のリストをひとつの文字列に連結することができます。join() 関数の構文は以下のとおりです。str には区切り文字 (セパレータ) を指定し、iterable には連結したいリスト名 (イテラブルオブジェクト) を指定します。

str.join(iterable)
join() 関数の構文

セパレータに空文字を指定した場合はリストが単純に連結され、カンマを指定した場合はカンマ区切りに連結され、改行文字を指定すれば要素ごとに改行されます。

l = ['a', 'b', 'c']

s = ''.join(l)
print(s)
# abc

s = ','.join(l)
print(s)
# a,b,c

s = '\n'.join(l)
print(s)
# a
# b
# c
join() 関数によるリストの連結

文字列を指定して置換する: replace

replace 関数は、置換元文字列 (old) を、置換先文字列 (new) に置換して返します。オプション引数 count が与えられている場合、先頭から最大置換回数分だけを置換します。

str.replace(old, new[, count])
str.replace() の構文
s = 'abc123abc123.'
print(s.replace('abc', '0'))
# 01230123
str.replace() による文字列の置換

count パラメータで、最大置換回数を指定することもできます。最大置換回数を超えた後続の文字列は置換されません。

s = 'abc123abc123.'
print(s.replace('abc', '0', 1))
# 0123abc123
str.replace() による文字列の置換

正規表現で置換する: re.sub, re.subn

re.sub 関数は、stringpattern で指定された正規表現パターンと一致した場合、repl で置換した文字列を返します。パターンが見つからない場合は、文字列がそのまま返されます。これらの関数は、標準ライブラリの re モジュールをインポートすると利用できます。基本的な正規表現の一覧は、基本的な正規表現一覧を参照してください。

re.sub(pattern, repl, string, count=0, flags=0)
re.sub() の構文

正規表現で置換する場合、以下の点に注意してください。

  • エスケープシーケンスを無視する場合は raw 文字列 (r"...") を使用します
  • raw 文字列を使わない場合、エスケープ文字 (\) 自体もエスケープする必要があります
  • 何度も使用する正規表現は事前にコンパイルを行い、使い回す方がパフォーマンスに優れます
import re

filepath = r"C:\work\template.xlsx"
pattern = re.compile(".+\\\\") # raw 文字列では r".+\\" となります
print(re.sub(pattern, '', filepath))
# template.xlsx
str.replace() による文字列の置換

re.subn() 関数は置換処理された文字列と、置換した部分の個数とのタプル (new_string, number_of_subs_made) を返します。

re.subn(pattern, repl, string, count=0, flags=0)
re.subn() の構文
import re

filepath = r"C:\work\template.xlsx"
pattern = re.compile(".+\\\\")
result = re.subn(pattern, '', filepath)
print(result)
# (template.xlsx, 1)

print(type(result))
# <class 'tuple'>

print(result[0])
# template.xlsx

print(result[1])
# 1
re.subn() の構文

複数の文字を指定して置換する: translate

translate() 関数は、複数の文字を指定して置換して返します。複数の文字列を置換するためには、変換テーブルを使います。変換テーブルを作成するためには、str.maketrans() を利用します。

str.translate(table)
str.translate() の構文
text = 'murashun.jp は、WEB 制作のフロントエンド技術情報を解説します。'
table = str.maketrans({
    '、': ',',
    '。': '.',
})
result = text.translate(table)

print(result)
# murashun.jp は,WEB 制作のフロントエンド技術情報を解説します.
re.subn() の構文

関連記事

Python 全体の仕様を体系的にまとめたページは、プログラミング Python 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
52
Shares:
1
Tag:
Python
hatebu icon
hatebu