「文字と文字列」の編集履歴(バックアップ)一覧に戻る
文字と文字列 - (2025/02/20 (木) 21:54:45) のソース
* 目次 #contents * 基本操作 ** 文字列の長さを調べる len関数を使う。 #highlight(){{ >>> len('ABC') 3 >>> len('あい') 2 >>> len('阿伊宇ab') 5 }} ** 文字列を連結する ~+演算子を使う。 #highlight(){{ >>> s = 'a' + 'bc' + 'def' >>> print(s) abcdef }} ** 文字列の指定した一部を取り出す スライス演算子を使う。インデックスの開始は0である。取り出す範囲の指定は、開始のインデックスは、取り出すその文字のインデックスを、終わりのインデックスは、取り出す文字の次のインデックスを指定することに注意。 #highlight(){{ >>> 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)を削除した文字列を返す。 #highlight(){{ >>> 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番目の例のとおり、正規表現を使って分割の条件を指定することができる。 #highlight(){{ >>> import re >>> s = '石見舞菜香,鈴木みのり , 野口瑠璃子, 安野希世乃 ,和多田美咲' >>> re.split(',', s) ['石見舞菜香', '鈴木みのり ', ' 野口瑠璃子', ' 安野希世乃 ', '和多田美咲'] >>> re.split('[ ,]+', s) ['石見舞菜香', '鈴木みのり', '野口瑠璃子', '安野希世乃', '和多田美咲'] }} ** 文字列を数値に変換する 整数の場合はint関数、小数の場合はfloat関数を使用する。 #highlight(){{ >>> 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進数であることを示す接頭語)。 #highlight(){{ あ 0x82A0 0xE38182 い 0x82A2 0xE38184 亜 0x889F 0xE4BA9C 井 0x88E4 0xE4BA95 }} #highlight(){{ >>> 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' }} 文字型変数を使用しなくても、文字列に直接使用することもできる。 #highlight(){{ >>> "あい亜井".encode("sjis") b'\x82\xa0\x82\xa2\x88\x9f\x88\xe4' }} ** raw文字列を使う raw文字列とは、エスケープシーケンスを無効にして、表記のままに文字列を解釈する文字列リテラルのこと。文字列リテラルの先頭にrをつけて表記する。 #highlight(){{ >>> s = "a\nbc\ndef" >>> print(s) a bc def >>> s = r"a\nbc\ndef" >>> print(s) a\nbc\ndef }} Windowsのパス区切り記号¥(円記号)は、普通の文字列リテラルでは「\\」(\を2つ)と表記する必要があるが、raw文字列を使うとそのまま書くことができる。 #highlight(){{ >>> s = "C:\\Windows\\System" >>> print(s) C:\Windows\System >>> s = r"C:\Windows\System" >>> print(s) C:\Windows\System }} * 応用操作 ** 同じ文字列が繰り返された文字列を作る *演算子を使う。 #highlight(){{ >>> 'A' * 3 'AAA' >>> 'Abc' * 4 'AbcAbcAbcAbc' }} ** 指定した長さの空白(0x20)文字列を作る 文字列リテラルと*演算子を使う。 #highlight(){{ >>> s = ' ' * 7 >>> len(s) 7 >>> print('>' + s + '<') > < }} ** 桁を変数で指定して書式化する formatメソッドまたは整形済み文字列リテラル(f文字列)を使用する。以下は、数値1.23456789を小数点以下4桁で表示(1.2346、四捨五入の処理により1.2345にはならない)するために、小数点以下4桁の指定(.4f)を、変数で指定した例。 #highlight(){{ >>> d = 1.23456789 >>> n = 4 >>> print('{:.{}f}'.format(d, n)) 1.2346 >>> print(f'{d:.{n}f}') 1.2346 }} ** 文字列のハッシュ値を得る hashlibモジュールの関数を使う。関数はハッシュオブジェクトというハッシュ値を格納したオブジェクトを返すので、関数を指定して戻り値を決める。 #highlight(){{ >>> 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メソッドを使う。 #highlight(){{ >>> 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メソッドかフォーマット済み文字列リテラルを使う。 #highlight(){{ >>> 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関数と例外処理を利用して以下のような関数を定義すればよい。 ソースコード #highlight(){{ 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")) }} 実行結果 #highlight(){{ True True False False False False }} ** 文字列が数値(小数)に変換できるか否か確認する float関数と例外処理を利用して以下のような関数を定義すればよい。 ソースコード #highlight(){{ 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")) }} 実行結果 #highlight(){{ True True True True False False }}