Intro to Python
文字と文字列
最終更新:
introtopython
目次
基本操作
文字列の長さを調べる
len関数を使う。
>>> len('ABC')
3
>>> len('あい')
2
>>> len('阿伊宇ab')
5
文字列を連結する
+演算子を使う。
>>> s = 'a' + 'bc' + 'def'
>>> print(s)
abcdef
文字列の指定した一部を取り出す
スライス演算子を使う。インデックスの開始は0である。取り出す範囲の指定は、開始のインデックスは、取り出すその文字のインデックスを、終わりのインデックスは、取り出す文字の次のインデックスを指定することに注意。
>>> s = "ABC123あいう"
>>> s[0]
'A'
>>> s[1]
'B'
>>> s[0:3]
'ABC'
>>> s[5:8]
'3あい'
>>> s[5:]
'3あいう'
>>> s[:4]
'ABC1'
文字列の前後の空白を取り除く
strip関数、lstrip関数、rstrip関数を使う。それぞれ、前後、前だけ、後ろだけの空白(0x20)を削除した文字列を返す。
>>> s = ' AB C DE '
>>> s
' AB C DE '
>>> s.strip()
'AB C DE'
>>> s.lstrip()
'AB C DE '
>>> s.rstrip()
' AB C DE'
文字列を特定の文字または文字列で分割する
reモジュールのsplit関数を使う。2番目の例のとおり、正規表現を使って分割の条件を指定することができる。
>>> import re
>>> s = '石見舞菜香,鈴木みのり , 野口瑠璃子, 安野希世乃 ,和多田美咲'
>>> re.split(',', s)
['石見舞菜香', '鈴木みのり ', ' 野口瑠璃子', ' 安野希世乃 ', '和多田美咲']
>>> re.split('[ ,]+', s)
['石見舞菜香', '鈴木みのり', '野口瑠璃子', '安野希世乃', '和多田美咲']
文字列を数値に変換する
整数の場合はint関数、小数の場合はfloat関数を使用する。
>>> int('1')
1
>>> int('1') + int(' 20 ')
21
>>> int('0.1')
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: '0.1'
>>> float('0.1')
0.1
>>> float('0.1') + float(' 1.5 ')
1.6
int関数もfloat関数も、引数に指定した文字列に空白が含まれていてもかまわない。int関数に小数を指定すると、エラーが発生する。
文字の文字コードを簡単に調べる
encodeメソッドを使用する。以下は、文字列「あい亜井」のそれぞれの文字の文字コードを調べた例。なお、これら文字の文字コード(左から、文字、その文字のシフトJISコード、その文字のutf-8コード)は以下のとおり(0xは16進数であることを示す接頭語)。
あ 0x82A0 0xE38182
い 0x82A2 0xE38184
亜 0x889F 0xE4BA9C
井 0x88E4 0xE4BA95
>>> s = "あい亜井"
>>> s.encode("sjis")
b'\x82\xa0\x82\xa2\x88\x9f\x88\xe4'
>>> s.encode("utf-8")
b'\xe3\x81\x82\xe3\x81\x84\xe4\xba\x9c\xe4\xba\x95'
文字型変数を使用しなくても、文字列に直接使用することもできる。
>>> "あい亜井".encode("sjis")
b'\x82\xa0\x82\xa2\x88\x9f\x88\xe4'
raw文字列を使う
raw文字列とは、エスケープシーケンスを無効にして、表記のままに文字列を解釈する文字列リテラルのこと。文字列リテラルの先頭にrをつけて表記する。
>>> s = "a\nbc\ndef"
>>> print(s)
a
bc
def
>>> s = r"a\nbc\ndef"
>>> print(s)
a\nbc\ndef
Windowsのパス区切り記号¥(円記号)は、普通の文字列リテラルでは「\\」(\を2つ)と表記する必要があるが、raw文字列を使うとそのまま書くことができる。
>>> s = "C:\\Windows\\System"
>>> print(s)
C:\Windows\System
>>> s = r"C:\Windows\System"
>>> print(s)
C:\Windows\System
応用操作
同じ文字列が繰り返された文字列を作る
*演算子を使う。
>>> 'A' * 3
'AAA'
>>> 'Abc' * 4
'AbcAbcAbcAbc'
指定した長さの空白(0x20)文字列を作る
文字列リテラルと*演算子を使う。
>>> s = ' ' * 7
>>> len(s)
7
>>> print('>' + s + '<')
> <
桁を変数で指定して書式化する
formatメソッドまたは整形済み文字列リテラル(f文字列)を使用する。以下は、数値1.23456789を小数点以下4桁で表示(1.2346、四捨五入の処理により1.2345にはならない)するために、小数点以下4桁の指定(.4f)を、変数で指定した例。
>>> d = 1.23456789
>>> n = 4
>>> print('{:.{}f}'.format(d, n))
1.2346
>>> print(f'{d:.{n}f}')
1.2346
文字列のハッシュ値を得る
hashlibモジュールの関数を使う。関数はハッシュオブジェクトというハッシュ値を格納したオブジェクトを返すので、関数を指定して戻り値を決める。
>>> import hashlib
>>> s = "鈴木みのり"
>>> md5 = hashlib.md5(s.encode()).hexdigest()
>>> print(md5)
2cdcdf384125ac19c173e9517b23847b
>>> sha1 = hashlib.sha1(s.encode()).hexdigest()
>>> print(sha1)
728d6a009b1700f9759ed2b502a0f673820700d5
>>> sha256 = hashlib.sha256(s.encode()).hexdigest()
>>> print(sha256)
4a806bf1e967f0764841aabcb3e634316f4b19be1dc9244480cd2c26c315db2b
バイト列リテラルからbytes型変数を作成する
文字列リテラルの前に接頭辞bを付ければよい。ただし、接頭辞bでは日本語を服もバイト列リテラルを作成できない。bytes関数を使うことであらゆる文字からなるバイト列文字列を作成することができる。ただし文字コードを指定する必要がある。
バイト列リテラルはprint関数の出力では、接頭辞bが付く。最後の例のとおりにバイト列を文字列に変換する場合はdecodeメソッドを使う。
>>> s = 'Watada Misaki'
>>> by = b'Watada Misaki'
>>> print(s)
Watada Misaki
>>> print(by)
b'Watada Misaki'
>>> s = '和多田美咲'
>>> by = bytes('和多田美咲', 'utf-8')
>>> print(s)
和多田美咲
>>> print(by)
b'\xe5\x92\x8c\xe5\xa4\x9a\xe7\x94\xb0\xe7\xbe\x8e\xe5\x92\xb2'
>>> by = bytes('和多田美咲', 'Shift_JIS')
>>> print(by)
b'\x98a\x91\xbd\x93c\x94\xfc\x8d\xe7'
>>> print(by.decode('Shift_JIS'))
和多田美咲
数値を文字列に変換する
formatメソッドかフォーマット済み文字列リテラルを使う。
>>> n = -1
>>> d1 = -2
>>> d2 = 3.4
>>> print("|{}|{}|{}|".format(n, d1, d2))
|-1|-2|3.4|
>>> print("|{2}|{1}|{0}|".format(n, d1, d2))
|3.4|-2|-1|
>>> print("|{0:6d}|{1:.3f}|{2:.4e}|".format(n, d1, d2))
| -1|-2.000|3.4000e+00|
>>> print(f"|{n}|{d1}|{d2}|")
|-1|-2|3.4|
>>> print(f"|{n:6d}|{d1:.3f}|{d2:.4e}|")
| -1|-2.000|3.4000e+00|
文字列が数値(整数)に変換できるか否か確認する
int関数と例外処理を利用して以下のような関数を定義すればよい。
ソースコード
def is_integer(s):
try:
d = int(s)
except Exception:
return False
else:
return True
print(is_integer("0"))
print(is_integer(" -6"))
print(is_integer(" -6.6 "))
print(is_integer("-6e-6"))
print(is_integer(""))
print(is_integer("abc123"))
実行結果
True
True
False
False
False
False
文字列が数値(小数)に変換できるか否か確認する
float関数と例外処理を利用して以下のような関数を定義すればよい。
ソースコード
def is_double(s):
try:
d = float(s)
except Exception:
return False
else:
return True
print(is_double("0"))
print(is_double(" -6"))
print(is_double(" -6.6 "))
print(is_double("-6e-6"))
print(is_double(""))
print(is_double("abc123"))
実行結果
True
True
True
True
False
False