文字列の操作
文字列のメソッドは正規表現を使うより速いので、文字列の操作をする場合は、まず文字列のメソッドでできないかを調べた方がよいです。
文字列の一部を取り出す
>>> 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'