S-JIS[2018-01-06/2018-01-09] 変更履歴
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-string」。
(Python3.6) 文字列内に(波括弧で囲んで)式を書ける。 接頭辞rと組み合わせてfrにすることも出来る。 |
b B | b"ABC" |
bytesクラスのリテラル。 接頭辞rと組み合わせてbrにすることも出来る。 |
生文字列(raw string)リテラルでは「\」を直接書くことが出来るが、文字列内の最後の文字として「\」を書くことは出来ない。(例:「r"temp\"
」はエラーになる)
エスケープ機能が働いて、「\」の直後のクォートもエスケープシーケンスの一部として認識してしまう(「文字列の終わりが無い」と判断してしまう)為らしい。
文字列リテラルでは、エスケープシーケンスが使用できる。(C言語のエスケープシーケンスと同様)
エスケープシーケンス | 例 | 同等の例 | 説明 |
---|---|---|---|
\改行 |
"a\ |
"ab" |
行末に「\」を書くと、ソースコード上は改行しても、実際の文字列は改行されない。(行が継続する) |
\\ |
"a\\b" |
r"a\b" |
「\」そのもの。 |
\' |
'\'' |
"'" |
シングルクォート。 |
\" |
"\"" |
'"' |
ダブルクォート。 |
\a |
ベル。 | ||
\b |
バックスペース。 | ||
\f |
フォームフィード。 | ||
\n |
"a\nb" |
"""a |
LF(ラインフィード) |
\r |
CR(キャリッジリターン) | ||
\t |
水平タブ。 | ||
\v |
垂直タブ。 | ||
\ ooo |
"\101" |
"A" |
八進数(1〜3桁)でコードが指定された文字。 |
\x hh |
"\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") |
True |
Pythonでは空文字列は偽、それ以外の文字列は真。 | "abc".nonEmpty |
s = "abc" |
exist |
|||
not "abc" |
False |
"abc".isEmpty |
||
比較 | "abc" == "abc" |
True |
"abc" == "abc" |
|
部分一致 | "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") |
1 |
指定された文字列の位置を返す。(rfindは右から探す) 見つからなかった場合は-1を返す。 |
"abcbcd".indexOf("bc") |
|
"abcbcd".index("bc") |
1 |
指定された文字列の位置を返す。(rindexは右から探す) 見つからなかった場合は例外(ValueError)が送出される。 |
||
置換 | "abcabc".replace("a", "x") |
'xbcxbc' |
第1引数で指定された文字列を第2引数の文字列に置換する。 第3引数で置換する個数を指定できる。(省略した場合は全て置換) |
"abcabc".replace("a", "x") |
"a\tb".expandtabs() |
'a b' |
タブをスペース(デフォルトでは8個)に置換した文字列を返す。 | ||
部分 | "abcd"[1] |
'b' |
文字列内の1文字を取得する。 添字には負の数を指定することができ、その場合は右から数えた位置になる。 つまり0が一番左、1は左から2文字目、-1は一番右、-2は右から2文字目。 |
"abcd".charAt(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'] |
指定された文字列で分割し、文字列のリストを返す。 第2引数で分割回数を指定できる。 |
"a,b,c".split(",") |
"""a |
['a', 'b', 'c'] |
改行文字で分割し、文字列のリストを返す。 | "a\nb\nc".lines.toArray |
|
"""a |
['a\n', 'b\n', 'c'] |
|||
"abcabc".partition("b") |
('a', 'b', 'cabc') |
指定された文字列で区切り、「区切りの前」「区切り文字列」「区切りの後」のタプルを返す。 | ||
判定 | " \t\r\n".isspace() |
True |
全て空白かどうか。(空文字列の場合はFalse) | |
"abc".isalpha() |
True |
全て英字かどうか。(空文字列の場合はFalse) | ||
"ABC".isupper() |
True |
全て大文字かどうか。(空文字列の場合はFalse) | ||
"abc".islower() |
True |
全て小文字かどうか。(空文字列の場合はFalse) | ||
"abc123".isalnum() |
True |
全て英数字かどうか。(空文字列の場合はFalse) | ||
"123".isdigit() |
True |
全て数字かどうか。(空文字列の場合はFalse) | ||
"abc".isprintable() |
True |
全て印字可能かどうか。 例えばタブ「\t」や改行「\n」は印字可能ではない。 |
||
"Abc Def".istitle() |
True |
タイトルかどうか。 タイトルとは、単語毎に先頭が大文字で残りが小文字みたいな、そんな感じっぽい雰囲気。 |
||
"abc"isidentifier() |
True |
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 |
'値は123です' |
%補間演算子。[2018-01-09] 書式に値を埋め込んだ文字列を返す。 %の後ろには値を1個(複数の場合はタプルで)指定する。 |
||
d = {"number": 123} |
'値は123です' |
%の後ろにdictを指定する形式。[2018-01-09] | ||
"abc".center(8) |
' abc ' |
中央寄せされた文字列を返す。 | ||
"abc".ljust(8) |
'abc ' |
左寄せされた文字列を返す。 | ||
"abc".rjust(8) |
' abc' |
右寄せされた文字列を返す。 | ||
"12".zfill(4) |
'0012' |
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() |
b'abc' |
bytesに変換する。 | ||
bin(65) |
'0b1000001' |
二進数の文字列に変換する。 | ||
oct(65) |
'0o101' |
八進数の文字列に変換する。 | ||
hex(65) |
'0x41' |
十六進数の文字列に変換する。 | ||
chr(65) |
'A' |
指定された文字コードの文字に変換する。 | Character.toString(65) |
|
ord("あ") |
12354 |
指定された文字の文字コードを返す。 | 'あ'.toInt |