初めてのPython(7章)

文字列は、immutableなシーケンスの一種

文字列の種類は

  • シングル or ダブルクォート
  • トリプルクォート
  • raw文字列
  • unicode文字列

文字列を整形する方法は

  • 文字列の連結
  • 文字列フォーマット

文字列オブジェクトでよく使うメソッド

  • 置換(replace)
  • 分割(split)
  • 結合(join)

文字列の種類

通常の文字列は、シングル or ダブルクォートで囲む。
通常は使い分けは不要だが、文字列中にシングル(ダブル)クォートを含む時は、ダブル(シングル)クォートを使う

トリプルクォート

ブロック文字列とも呼ばれ、複数行からなる文字列を扱う場合やドキュメンテーション文字列として使われる。
複数行の文字列の場合、改行した場所が自動的に『\n』で置き換えられた文字列オブジェクトが出来る。

>>> sentence = """Hello World.
...  What is 'Monty Python'?
...   I have never watched 'Monty Python'."""
>>> sentence
"Hello World.\n What is 'Monty Python'?\n  I have never watched 'Monty Python'."
>>> print sentence
Hello World.
 What is 'Monty Python'?
  I have never watched 'Monty Python'.
>>> 

ドキュメンテーション文字列(docstring)は、クラスや関数の説明を記述し、help()関数で参照する時に使用する。

raw文字列

raw文字列は、文字列の先頭のクォートの前にrを入れた文字列。
エスケープシーケンスを含め全ての文字が単なる文字として扱われる。
Windowsのパス指定などに使うと、バックスラッシュのことを気にしないでも済む
raw文字列の場合、『\』は自動的に『\\』として扱ってくれる。

>>> str_path = 'C:\new\text.data'
>>> str_path
'C:\new\text.data'
>>> print str_path
C:
ew	ext.data
>>> str_rpath = r'C:\new\text.data'
>>> str_rpath
'C:\\new\\text.data'
>>> print str_rpath
C:\new\text.data
>>> 

print文の有無で表示が違うのは、str()とrepr()の違い。
reprはPython内部の表現で、strは人間に見せるための表現。

unicode文字列

文字列の先頭のクォートの前にuを入れた文字列で、2バイト以上の文字コードを扱える。
XMLの解析などで使うことが多いが、 Pythonでは非unicodeからunicodeへの変換(逆も)を自動で行われる。

文字列の整形

特定の位置に文字を埋め込んだり、新しい文字列を作成したり、出力したりするために文字列を整形する。
1つだけ文字を埋め込みたい時などは、連結(+演算子)でも出来る。

出力形式や順序などを簡単に指定するには、文字列フォーマットを使う。
次の形式で使用し、フォーマットに使えるコードはCとほぼ同じ。

  • "整形済み文字列のフォーマット" % (埋め込みたいオブジェクトのタプル)
  • "整形済み文字列のフォーマット" % {埋め込みたいオブジェクトのディクショナリ}
文字列フォーマット(タプル)

タプルに指定する順序でフォーマットとオブジェクトを対応づける方式

>>> "I ate %d %s yesterday" % (2, "eggs")
'I ate 2 eggs yesterday'
文字列フォーマット(ディクショナリ)

ディクショナリのキーでフォーマットとオブジェクトを対応づける方式。
ディクショナリのキーをフォーマット内に埋め込んで使用する。

>>> "I ate %(number)d %(food)s yesterday" % {"number":2, "food":"eggs")
'I ate 2 eggs yesterday'

ビルドイン関数var()を使うと、あらかじめディクショナリとして定義した変数を持っていなくても、同様のことが出来る。

>>> number = 2
>>> food = "eggs"
>>> vars()
{'__builtins__': <module '__builtin__' (built-in)>, 'number': 2, '__package__': None, 'food': 'eggs', '__name__': '__main__', '__doc__': None}
>>> "I ate %(number)d %(food)s" % vars()
'I ate 2 eggs'
>>> 

文字列のメソッド

文字列オブジェクトにどんなメソッドが存在するかはhelp(str)で。

置換(replace)

str.replace(new, old[, count])で実行し、置換した新しい文字列を返す(strは文字列オブジェクト or それをおさめた変数名)
countは置換回数を指定するが、省略すると該当する文字列全てを置換する。

>>> sentence = "I ate egg yesterday. But shlef life of the egg was over. So I have stomachache."
>>> sentence.replace('egg', 'spam')
' I ate spam yesterday. But shelf life of the spam was over. So I have stomachache'
>>> sentence.replace('egg', 'spam', 1)
' I ate spam yesterday. But shelf life of the egg was over. So I have stomachache'
分割(split)

str.split([sep[, maxsplit]])で実行し、分割した文字列を要素とするリストを返す
sepは分割文字を指定するが、省略するとホワイトスペースで分割する。
maxsplitは最大分割数を指定する(分割数-1で指定、インデクシングの関係かな)

>>> sentence = "I ate egg yesterday. But shlef life of the egg was over. So I have stomachache."
>>> sentence.split()
['I', 'ate', 'egg', 'yesterday.', 'But', 'shelf', 'life', 'of', 'the', 'egg', 'was', 'over.', 'So', 'I', 'have', 'stomachache']
>>> sentence.split('.')
[' I ate egg yesterday', ' But shelf life of the egg was over', ' So I have stomachache']
>>> sentence.split('.', 1)
[' I ate egg yesterday', ' But shelf life of the egg was over. So I have stomachache']
結合(join)

str.join(sequence)で実行し、sequenceの各要素をstr区切りで結合した文字列を返す

>>> sentence = "I ate egg yesterday. But shlef life of the egg was over. So I have stomachache."
>>> splited_list = sentece.split()
>>> splited_list = sentence.split()
>>> ' '.join(splited_list)
'I ate egg yesterday. But shelf life of the egg was over. So I have stomachache'
>>> ','.join(splited_list)
'I,ate,egg,yesterday.,But,shelf,life,of,the,egg,was,over.,So,I,have,stomachache'
>>>