いまさらだけど文字列の操作についてメモしておく。
リテラル
文字列のリテラルはシングルクォートかダブルクォートで囲んで作る。シングルクォートの中ではダブルクォートが、ダブルクォートの中ではシングルクォートがそのまま使えるという以外には違いが無いみたい。
>>> 'abc' 'abc' >>> "abc" 'abc' >>> "APOSTROPHE(')" "APOSTROPHE(')"
三重のクォート(ダブルクォートでもシングルクォートでも)で囲むと、エスケープなしで改行を含めることができる。
>>> '''foo ... bar ... baz''' 'foo\nbar\nbaz'
連結
文字列の連結は、+演算子を使う。
>>> a = 'foo' >>> b = 'bar' >>> a + b 'foobar'
リテラル同士なら、+演算子なしでも並べるだけで連結される。
>>> 'foo' "bar"'baz' 'foobarbaz'
抽出とスライス
文字列中の文字は、インデックスを使って抽出することができる。
>>> s = 'abcde' >>> s[3] 'd'
部分文字列の抽出にはスライスを使う。スライスの前または後ろは省略することもできる。このときは文字列の最初または最後が指定されたのと同じ。
>>> s[2:4] 'cd' >>> s[:3] 'abc' >>> s[3:] 'de'
大文字・小文字
文字列のupper、lowerメソッドを使う。
>>> 'abcde'.upper() 'ABCDE' >>> 'ABCDE'.lower() 'abcde'
キャピタライズ。
>>> 'abcde'.capitalize() 'Abcde'
titleという面白いメソッドもある。CDアルバムや書籍のタイトルみたいに各単語をキャピタライズしてくれる。
>>> 'one size fits all'.title() 'One Size Fits All'
部分文字列の検索
findは左から、rfindは右から検索して部分文字列の先頭位置をインデックスで返す。もし見つからない場合は-1が返ってくる。
>>> 'foobarbazfoobarbaz'.find('bar') 3 >>> 'foobarbazfoobarbaz'.rfind('bar') 12 >>> 'foobarbazfoobarbaz'.find('abc') -1
index、rindexはfind、rfindと同様だけど、部分文字列が見つからなかった場合にはエラーを発生する。
>>> 'foobarbazfoobarbaz'.index('baz') 6 >>> 'foobarbazfoobarbaz'.rindex('baz') 15 >>> 'foobarbazfoobarbaz'.rindex('abc') Traceback (most recent call last): File "", line 1, in ValueError: substring not found
countは部分文字列が何回出現するかを返す。
>>> 'foobarbazfoobarbaz'.count('foo') 2
開始文字列と終了文字列
文字列が、部分文字列で始まっているかあるいは終わっているかを調べるには、startswith、endswithを使う。
>>> 'foobarbaz'.startswith('foo') True >>> 'foobarbaz'.endswith('foo') False
置換
部分文字列を置き換えるには、replaceを使う。
>>> 'foobarbaz'.replace('bar', 'BAR') 'fooBARbaz'
部分文字列が複数回現れるときには、すべて置換してくれるようだ。
>>> 'foobarbazfoobarbaz'.replace('bar', 'BAR') 'fooBARbazfooBARbaz'
正規表現で部分文字列を指定するには、reモジュールのre.sub関数が使える。
>>> re.sub('ba.', 'X', 'foobarbazfoobarbaz') 'fooXXfooXX'
リストに分割・リストから組み立てる
リストに分割するには、splitを使う。
>>> 'abcacbcba'.split('b') ['a', 'cac', 'c', 'a']
ところが、1文字ずつに分割しようとしてもうまくいかない。
>>> 'abcacbcba'.split('') Traceback (most recent call last): File "", line 1, in ValueError: empty separator
こういうときは、list関数を使えばいい。
>>> list('abcacbcba') ['a', 'b', 'c', 'a', 'c', 'b', 'c', 'b', 'a']
正規表現で分割したいときは、reモジュールのre.splitを使う。
>>> import re >>> re.split(' +', 'foo bar baz') ['foo', 'bar', 'baz']
リストからひとつの文字列に組み立てるにはjoin。
>>> ','.join(['foo', 'bar', 'baz']) 'foo,bar,baz'
前後の空白を削除する
stripを使う。
>>> ' foo '.strip() 'foo'
左だけ、または右だけ削除するにはlstripとrstrip。
>>> ' foo '.lstrip() 'foo ' >>> ' foo '.rstrip() ' foo'
どのメソッドも削除する文字を指定することもできる。
>>> '-- foo =='.strip('-') ' foo ==' >>> '-- foo =='.lstrip('-') ' foo ==' >>> '-- foo =='.rstrip('-') '-- foo =='
片寄せ・中寄せ
左または右に寄せるには、ljust、rjust。中寄せするにはcenter。
>>> 'foo'.ljust(10) 'foo ' >>> 'foo'.rjust(10) ' foo' >>> 'foo'.center(10) ' foo '
文字種を調べる
isalpha、isdigit、isalnum、isspace。
>>> 'abc'.isalpha() True >>> '123'.isdigit() True >>> 'abc123'.isalnum() True >>> ' \t\n'.isspace() True
isuppre、islower。
>>> 'FOO'.isupper() True >>> 'foo'.islower() True
このくらいかな。