Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
7. プロのようにデータを操る
7.1 文字列
7.1.3 書式の指定
文字列にデータを差し込む方法を考える。
- %を用いた古いスタイル: %を用いる。文字列の中にはデータを差し込むポイントが含まれている。
- {}を用いた新しいスタイル: を用いる。
################## ### 古いスタイル ### ################## '%s' % 42 '%s' % 7.03 "My wife's favourite actor is %s" % actor # 文字列の中の%sは文字列を挿入する "Our cat %s weighs %s pouds" % (cat, weight) # 複数挿入する場合、挿入するものはタプルとする # %と型指定子の間には、幅の下限、文字数の上限、配置、パディング(表示要素の内側に設けられた余白や、データを一定の長さに整形するため前後に挿入される無意味なデータ)を指定可能 n = 42 f = 7.03 s = 'string cheese' '%d %f %s' % (n, f, s) '%10d %10f %10s' % (n, f, s) # フィールド幅の最小値(10)を指定。右揃え '%-10d %-10f %-10s' % (n, f, s) # フィールド幅の最小値(10)を指定。左揃え '%10.4d %10.4f %10.4s' % (n, f, s) # フィールド幅の最小値(10)を指定。文字数の上限を4として右揃え '%.4d %.4f %10.4s' % (n, f, s) # フィールド幅の最小値を指定せず文字数の上限を4とする # フィールド幅と文字列をハードコードせず引数から指定 '%*.*d %*.*f %*.*s' % (10,4,n,10,4,f,10,4,s) #################### ### 新しいスタイル ### #################### '{} {} {}'.format(n, f, s) '{2} {0} {1}'.format(n, f, s) # {}中の数字で引数の順序を指定可能 '{n} {f} {s}'.format(n = 42, f = 7.03, s = 'string cheese') # これもOK # 辞書を充ててもよい d = {'n' : 42, 'f' : 7.03, 's' : 'string cheese'} '{(0[n])} {(0[f])} {(0[s])}'.format(d, 'other') '{0:d} {1:f} {2:s}'.format(n, f, s) # 型指定は:の後に挿入 '{n:d} {f:f} {s:s}'.format(n = 42, f = 7.03, s = 'string cheese') # キーワード引数で指定 # その他オプションの指定方法 '{0:10d} {1:10f} {2:10s}'.format(n, f, s) # フィールド幅の下限を10とする '{0:>10d} {1:>10f} {2:>10s}'.format(n, f, s) # フィールド幅の下限を10とし、右揃えとする '{0:<10d} {1:<10f} {2:<10s}'.format(n, f, s) # フィールド幅の下限を10とし、左揃えとする '{0:^10d} {1:^10f} {2:^10s}'.format(n, f, s) # フィールド幅の下限を10とし、中央揃えとする '{0:!^20s}'.format("BIG SALE") # パディングのやり方
7.1.4 正規表現とのマッチング
正規表現機能は、標準モジュールのが提供する。
マッチング対象となる文字列のパターンとマッチングするソース文字列を指定する。
import re # match()はソースの先頭がパターンになっているかをチェックする result = re.match('You', 'Young Frankenstein') # 先にパターンをコンパイルして、後で行うマッチングのスピードを上げることができる youpattern = re.compile('You') result = youpattern.match('Young Frankenstein')
存在すれば最初のマッチを返す。 | ||
存在すれば重なり合わないすべてのマッチのリストを返す。 | ||
パターンにマッチしたところでソースを分割し、部分文字列のリストを返す。 | ||
置換文字列引数を取り、ソースのうち、パターンにマッチするすべての部分を置換文字列を返す。 |
import re # 各種正規表現処理 ## match: 先頭がパターンに一致するかを見る result1_1 = re.match('You', 'Young Frankenstein') result1_2 = re.match('^You', 'Young Frankenstein') # 先頭がパターンに一致するかを見る:^は先頭から検索することを明示 result2 = re.match('Frank', 'Young Frankenstein') print(result1_1) print(result1_2) print(result2) ## search: 先頭に限らずパターンに一致するかを見る result3_1 = re.search('You', 'Young Frankenstein') result3_2 = re.search('Frank', 'Young Frankenstein') result3_3 = re.match('.*Frank', 'Young Frankenstein') # .:任意の文字列, *:任意の個数の直前のもの print(result3_1) print(result3_2) print(result3_3) ## findall: 指定正規パターンが文字列にいくつあるか result4_1 = re.findall('n','Young Frankenstein') result4_2 = re.findall('.n','Young Frankenstein') print(result4_1) print(result4_2) # split: 正規パターンで文字列を分割して部分文字列のリストを返す result5 = re.split('n', 'Young Frankenstein') print(result5) # sub: relace()と異なり置換対象としてリテラル文字列ではなくパターンを指定 result6 = re.sub('got','will get', 'I got up early') # 引数は(正規表現パターン,置換先文字列,処理対象の文字列) print(result6)
7.1.5 パターンの特殊文字
パターン |
マッチ対象 |
|
---|---|---|
. | \n以外の任意の1文字にマッチ | |
* | (0個も含めた)任意の個数の直前の文字にマッチ | |
? | 0個か1個の直前の文字にマッチ | |
\d | 1個の数字 | |
\D | 1個の数字以外の文字 | |
\w | 1個の英字 | |
\W | 1個の英字以外の文字 | |
\s | 1個の空白文字 | |
\S | 1個の空白以外の文字 | |
\b | 単語の境界(\wと\Wの間。順序は任意) | |
\B | 単語の境界以外の文字間 |
########################## ### パターンの特殊文字 ### ########################## import string import re printable = string.printable len(printable) print(printable) # 数字 any_numbers = re.findall('\d', printable) print(any_numbers) # 数字、英字、アンダースコアのいずれか any_symbols = re.findall('\w', printable) print(any_symbols) # 空白文字 any_blanks = re.findall('\s', printable) print(any_blanks)
*1:第2版が出ているものの初版しか持っていないのでこちらで。