文字列の操作

文字列のメソッドは正規表現を使うより速いので、文字列の操作をする場合は、まず文字列のメソッドでできないかを調べた方がよいです。

文字列の一部を取り出す

>>> s = "python"
>>> s[2]        # 2番目の要素を取り出す
't'
>>> s[1:4]      # 1番目から3番目までの文字を取り出す
'yth'
>>> print s[2:] # 2番目から末尾までの文字を取り出す
そん
>>> s[0] = "P"  # 文字列は不変なので、要素への代入は不可
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

文字列が○○だけであるかを調べる

>>> "abcABC123".isalnum() # 英数字だけか
True
>>> "abc=123".isalnum()
False
>>> "abcABC".isalpha()    # 英字だけか
True
>>> "abc123".isalpha()
False
>>> "123456".isdigit()    # 数字だけか
True
>>> "123.456".isdigit()   
False
>>> "  \n\t\r".isspace()  # 空白文字だけか
True
>>> "  a   ".isspace()
False

空白文字の削除

>>> s = "\t\n  Hello, world!  \t\n"
>>> s.lstrip()      # 先頭の空白文字を削除
'Hello, world!  \t\n'
>>> s.rstrip()      # 末尾の空白文字を削除
'\t\n  Hello, world!'
>>> s.strip()       # 先頭と末尾の空白文字を削除
'Hello, world!'
>>>
>>> s.strip("\t\n") # 引数があれば、その文字列を削除
'  Hello, world!  '

文字列の一部分を別の文字列で置き換える

>>> s = "HELLO!!"
>>> s.replace("ELLO", "ello")
'Hello!!'

複数の文字を一度に置き換える

>>> s = "Hello!! How are you?"
>>> table = map(chr, xrange(0, 256))
>>> table[ord("!")] = "-"
>>> table[ord("?")] = "="
>>> s.translate("".join(table))
'Hello-- How are you='

まず、インデクスとその要素の文字の整数値が同じリストを作成します。例えばi番目の要素の値はchr(i)になります。次にaをbに置き換えたいのならば、ord(a)番目の要素をbに置き換えます。そのリストを文字列にしたものが変換テーブルです。translate( )は変換テーブルに従って、文字の変換を行います。例えば、文字xはtable[ord(x)]で置き換えられます。ord(x)がtableの範囲外なら何もしません。文字列ではなく文字同士を置き換えます。aとabを置き換えるというようなことはできません。


string.maketrans( )を使うと変換テーブルを簡単に作成できます。

>>> import string
>>> s = "Hello!! How are you?"
>>> s.translate(string.maketrans("!?", "-="))
'Hello-- How are you='

文字列を削除する

>>> s = "Hellllllo!!"
>>> s.replace("llll", "") # 空文字で置き換える
'Hello!!'

複数の文字を一度に削除する

tranlate( )は第二引数を指定した場合、引数に含まれる文字を削除してから、文字を置き換えます。

>>> s = "Hello!! How are you?"
>>> s.translate(string.maketrans("", ""), "!?")  # !と?を削除
'Hello How are you'
>>> s.translate(string.maketrans("!", "?"), "?") # 削除して置換
'Hello?? How are you'

文字列を文字列で分割する

>>> s = "perl,python,ruby"
>>> s.split(",") 
['perl', 'python', 'ruby']
>>>
>>> s = ",perl,python,ruby,"
>>> s.split(",")
['', 'perl', 'python', 'ruby', '']
>>> s.strip(",").split(",") # strip( )と併用
['perl', 'python', 'ruby']
>>
>>> s = "perl:python:ruby"
['perl', 'python,ruby']
>>> s.split(":", 1)         # 1回だけ分割する
['perl', 'python,ruby']
>>> s.rsplit(":", 1)        # 後ろから1回だけ分割する
['perl,python', 'ruby']
>>>
>>> s = "  perl\tpython\nruby   "
>>> s.split()               # 引数が省略されるかNoneだと空白文字列で分割
['perl', 'python', 'ruby']
>>>
>>> s = "perl\npython\nruby"
>>> s.splitlines()          # 改行文字で分割
['perl', 'python', 'ruby']
>>> s.splitlines(True)      # 改行文字を残す
['perl\n', 'python\n', 'ruby']

文字列の先頭または末尾が○○であるかを調べる

>>> s = "python is programming laungage"
>>> s.startswith("python") # pythonで始まるかを調べる
True
>>> s.endswith("python")   # pythonで終わるかを調べる
False

文字列の中に○○が含まれるかを調べる

>>> s = "python is python"
>>> s.find("python")         # 前から調べる
0
>>> s.rfind("python")        # 後ろから調べる
10
>>> s.find("python", 3, 10)  # s[3:10]の範囲で調べる
-1                           # 見つからなければ-1を返す
>>>
>>> s.index("python")        # find( )と同じ
0
>>> s.rindex("python")       # rfind( )と同じ
10
>>> s.index("python", 3, 10) # 見つからなければ例外
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
>>>
>>> s.count("python")        # 引数で指定した文字列がいくつ含まれるか
2

大文字と小文字の置き換え

>>> s = "pyThoN"
>>> s.upper()      # 全て大文字にする
'PYTHON'
>>> s.lower()      # 全て小文字にする
'python'
>>> s.swapcase()   # 大文字と小文字を入れ替える
'PYtHOn'
>>> s.capitalize() # 先頭を大文字、その他を小文字にする
'Python'

幅寄せ

>>> s = "python"
>>> s.ljust(10)     # 左寄せ
'python    '
>>> s.rjust(10)     # 右寄せ
'    python'
>>> s.center(10)    # 中央寄せ
'  python  '
>>> "123".zfill(10) # 0で埋めて左寄せ
'0000000123'