S-JIS[2018-01-06/2018-01-09] 変更履歴

Pythonの文字列

Python3.6.4の文字列のメモ。


概要

Pythonの文字列はstrクラスのイミュータブル(不変)なオブジェクトである。

また、文字のシーケンスとしても扱える。
ただし、「文字」と言っても長さが1文字の文字列(strクラス)である。
(Javaだと文字列はStringで文字はcharというように型が分かれているが、Pythonにはcharのような型は無い)

strはUnicodeの文字列である。(以前のバージョンでは違ったらしい)
strに似たクラスとして、ASCIIのみ(0x00〜0xff)を扱う8ビット文字列(bytesクラス)(イミュータブル)がある。bytesに対するミュータブル(可変)なクラスとしてbytearrayがある。
(strに対応するミュータブルな文字列型は無いらしい)


文字列リテラル

文字列のリテラルは色々な形式で表せる。

s = "abc'def"
s = 'あいうえお"かきくけこ'
# "あ\nい\nう"と同じ
s = """あ
い
う"""
# "あいう"と同じ(行末の「\」は行継続)
s = """あ\
い\
う"""

文字列リテラル同士を(空白区切りで)並べると、結合された文字列になる。

"abc" "def"

↓同じ

"abcdef"

文字列リテラルの接頭辞

文字列リテラルの前に接頭辞(prefix)を付けることが出来る。

接頭辞 説明
u U u"あいう" 接頭辞なしと同じ。
(以前のバージョンでは接頭辞なしがUnicodeではなかったらしい。
 →杜甫々さんのUnicode文字列
r R r"C:\temp\python"
"C:\\temp\\python"と同じ)
生文字列(raw string)
「\」を直接書ける。
f F n = 123
f"値は{n}です"
フォーマット済み文字列リテラル。通称「f-string」。 (Python3.6)
文字列内に(波括弧で囲んで)式を書ける。
接頭辞rと組み合わせてfrにすることも出来る。
b B b"ABC" bytesクラスのリテラル。
接頭辞rと組み合わせてbrにすることも出来る。

生文字列(raw string)リテラルでは「\」を直接書くことが出来るが、文字列内の最後の文字として「\」を書くことは出来ない。(例:「r"temp\"」はエラーになる)
エスケープ機能が働いて、「\」の直後のクォートもエスケープシーケンスの一部として認識してしまう(「文字列の終わりが無い」と判断してしまう)為らしい。


エスケープシーケンス

文字列リテラルでは、エスケープシーケンスが使用できる。(C言語のエスケープシーケンスと同様)

エスケープシーケンス 同等の例 説明
\改行 "a\
b"
"ab" 行末に「\」を書くと、ソースコード上は改行しても、実際の文字列は改行されない。(行が継続する)
\\ "a\\b" r"a\b" 「\」そのもの。
\' '\'' "'" シングルクォート。
\" "\"" '"' ダブルクォート。
\a     ベル。
\b     バックスペース。
\f     フォームフィード。
\n "a\nb" """a
b"""
LF(ラインフィード)
\r     CR(キャリッジリターン)
\t     水平タブ。
\v     垂直タブ。
\ooo "\101" "A" 八進数(1〜3桁)でコードが指定された文字。
\xhh "\x41" "A" 十六進数(2桁)でコードが指定された文字。
\N{名前} "\N{CR}\N{LF}" "\r\n" Unicodeデータベースで付けられている名前で指定された文字。
\uxxxx "\u3042" "あ" 十六進数(4桁)のUnicodeで指定された文字。
\Uxxxxxxxx "\U00003042" "あ" 十六進数(8桁)のUnicodeで指定された文字。

文字列の操作

文字列に関するメソッド・組み込み関数。

内容 例の結果 説明 Scala相当
長さ len("abc") 3 文字列の長さを取得する。 "abc".length
空判定 bool("abc")
bool("")
True
False
Pythonでは空文字列は偽、それ以外の文字列は真。 "abc".nonEmpty
"".nonEmpty
s = "abc"
if s: print("exist")
else: print("empty")
exist  
not "abc"
not ""
False
True
"abc".isEmpty
"".isEmpty
比較 "abc" == "abc"
"abc" != "def"
"aaa" < "bbb"
"zzz" > "aaa"
"aaa" <= "bbb"
"zzz" >= "aaa"
True
True
True
True
True
True
  "abc" == "abc"
"abc" != "def"
"aaa" < "bbb"
"zzz" > "aaa""
"aaa" <= "bbb"
"zzz" >= "aaa"
部分一致 "b" in "abc" True 指定された文字列が含まれているかどうか。 "abc".contains("b")
"abc".startswith("ab") True 指定された文字列で始まっているかどうか。 "abc".startsWith("ab")
"abc".endswith("bc") True 指定された文字列で終わっているかどうか。 "abc".endsWith("bc")
探索 "abcbcd".count("bc") 2 指定された文字列が存在する個数を返す。  
"abcbcd".find("bc")
"abcbcd".rfind("bc")
1
3
指定された文字列の位置を返す。(rfindは右から探す)
見つからなかった場合は-1を返す。
"abcbcd".indexOf("bc")
"abcbcd".lastIndexOf("bc")
"abcbcd".index("bc")
"abcbcd".rindex("bc")
1
3
指定された文字列の位置を返す。(rindexは右から探す)
見つからなかった場合は例外(ValueError)が送出される。
 
置換 "abcabc".replace("a", "x")
"abcabc".replace("a", "x", 1)
'xbcxbc'
'xbcabc'
第1引数で指定された文字列を第2引数の文字列に置換する。
第3引数で置換する個数を指定できる。(省略した場合は全て置換)
"abcabc".replace("a", "x")
"a\tb".expandtabs()
"a\tb".expandtabs(4)
'a        b'
'a    b'
タブをスペース(デフォルトでは8個)に置換した文字列を返す。  
部分 "abcd"[1] 'b' 文字列内の1文字を取得する。
添字には負の数を指定することができ、その場合は右から数えた位置になる。
つまり0が一番左、1は左から2文字目、-1は一番右、-2は右から2文字目。
"abcd".charAt(1)
"abcd"(1)
"abcd"[-1] 'd'  
"abcd"[1:3] 'bc' 文字列の一部分を取得する。(スライス記法 "abcd".substring(1, 3)
結合 "a" + "b" 'ab' 文字列同士の結合は「+」演算子を使う。
文字列と数値のような結合「"a" + 123」は出来ない。(やりたければ「"a" + str(123)」の様にする)
文字列リテラル同士の場合は、空白区切りで並べると結合された文字列になる)
"a" + "b"
"ab" * 3 'ababab' 「*」演算子で、文字列を指定回数繰り返した文字列になる。 "ab" * 3
",".join(["a", "b", "c"]) 'a,b,c' 文字列のリストを区切り文字付きで結合する。 Seq("a", "b", "c").mkString(",")
分割 "a,b,c".split(",")
"a,b,c".split(",", 1)
"a,b,c".rsplit(",", 1)
['a', 'b', 'c']
['a', 'b,c']
['a,b', 'c']
指定された文字列で分割し、文字列のリストを返す。
第2引数で分割回数を指定できる。
"a,b,c".split(",")
"a,b,c".split(",", 2)
"""a
b
c""".splitlines()
['a', 'b', 'c'] 改行文字で分割し、文字列のリストを返す。 "a\nb\nc".lines.toArray
"""a
b
c""".splitlines(True)
['a\n', 'b\n', 'c']  
"abcabc".partition("b")
"abcabc".rpartition("b")
('a', 'b', 'cabc')
('abca', 'b', 'c')
指定された文字列で区切り、「区切りの前」「区切り文字列」「区切りの後」のタプルを返す。  
判定 " \t\r\n".isspace() True 全て空白かどうか。(空文字列の場合はFalse)  
"abc".isalpha() True 全て英字かどうか。(空文字列の場合はFalse)  
"ABC".isupper() True 全て大文字かどうか。(空文字列の場合はFalse)  
"abc".islower() True 全て小文字かどうか。(空文字列の場合はFalse)  
"abc123".isalnum() True 全て英数字かどうか。(空文字列の場合はFalse)  
"123".isdigit()
"123".isdecimal()
"123".isnumeric()
True
True
True
全て数字かどうか。(空文字列の場合はFalse)  
"abc".isprintable() True 全て印字可能かどうか。
例えばタブ「\t」や改行「\n」は印字可能ではない。
 
"Abc Def".istitle() True タイトルかどうか。
タイトルとは、単語毎に先頭が大文字で残りが小文字みたいな、そんな感じっぽい雰囲気。
 
"abc"isidentifier()
"abc.d"isidentifier()
True
False
Pythonの識別子として正しいかどうか。  
変換 "aBcD".upper() 'ABCD' 大文字に変換した文字列を返す。 "aBcD".toUpperCase
"aBcD".lower() 'abcd' 小文字に変換した文字列を返す。 "aBcD".toLowerCase
"aBcD".swapcase() 'AbCd' 大文字を小文字に、小文字を大文字に変換した文字列を返す。  
"aBcD".casefold() 'abcd' casefoldされた文字列を返す。
大文字小文字を無視した文字列比較に使える。
言語毎の文字の特性に応じて、lowerよりも色々変換するらしい。
 
"abc def".title() 'Abc Def' タイトルケースに変換した文字列を返す。
概ね、単語毎に先頭を大文字、残りを小文字に変換したもの。
 
"aBcD".capitalize() 'Abcd' 先頭を大文字、残りを小文字にした文字列を返す。  
整形 "値は{0}です".format(123) '値は123です' 書式に値を埋め込んだ文字列を返す。
値は可変長引数で指定する。波括弧内の数値は引数の番号。
Python3.6以降はf-stringの方が便利。
"値は%dです".format(123)
"名前は{name}".format_map({"name": "zzz"}) '名前はzzz' 書式に値を埋め込んだ文字列を返す。
値はdictで指定する。波括弧内の文字列はdictのキー。
 
"値は%dです" % 123
"%s%d" % ("abc", 123)
'値は123です'
'abc123'
%補間演算子[2018-01-09]
書式に値を埋め込んだ文字列を返す。
%の後ろには値を1個(複数の場合はタプルで)指定する。
 
d = {"number": 123}
"値は%(number)dです" % d
'値は123です' %の後ろにdictを指定する形式。[2018-01-09]  
"abc".center(8) '  abc   ' 中央寄せされた文字列を返す。  
"abc".ljust(8) 'abc     ' 左寄せされた文字列を返す。  
"abc".rjust(8) '     abc' 右寄せされた文字列を返す。  
"12".zfill(4)
"-12".zfill(4)
'0012'
'-012'
0埋めした文字列を返す。  
"  abc  ".strip() 'abc' 両端の空白を除去する。
引数で除去すべき文字群を指定できる。(何も指定しないと空白)
"  abc  ".trim()
"  abc  ".lstrip() 'abc  ' 先頭の空白を除去する。
引数で除去すべき文字群を指定できる。(何も指定しないと空白)
 
"  abc  ".rstrip() '  abc' 末尾の空白を除去する。
引数で除去すべき文字群を指定できる。(何も指定しないと空白)
 
型変換 str(123) '123' 文字列(str)に変換する。 123.toString
repr(123) '123' 印字可能な文字列を返す。
PythonのREPL(対話モード)ではrepr関数を使って結果を表示している。
 
ascii("あ") "'\\u3042'" 印字可能な文字列を返す。
ASCII以外の文字はエスケープされる。
 
"abc".encode()
"abc".encode("utf8")
b'abc'
b'abc'
bytesに変換する。  
bin(65) '0b1000001' 二進数の文字列に変換する。  
oct(65) '0o101' 八進数の文字列に変換する。  
hex(65) '0x41' 十六進数の文字列に変換する。  
chr(65) 'A' 指定された文字コードの文字に変換する。 Character.toString(65)
ord("あ") 12354 指定された文字の文字コードを返す。 'あ'.toInt

Pythonへ戻る / 技術メモへ戻る
メールの送信先:ひしだま