「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。

MENU

Pythonをゆっくりていねいに学ぶ(その18/X)

 Pythonを真面目にゆっくり学ぶべく

を参考に学んでいきます*1

7. プロのようにデータを操る

7.1 文字列

7.1.3 書式の指定

 文字列にデータを差し込む方法を考える。

  • %を用いた古いスタイル

     \mathrm{string}%\mathrm{data}を用いる。文字列の中にはデータを差し込むポイントが含まれている。
  • {}を用いた新しいスタイル

     \left\{\right\}を用いる。
##################
### 古いスタイル ###
##################
'%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 正規表現とのマッチング

 正規表現機能は、標準モジュールの\mathrm{re}が提供する。
 マッチング対象となる文字列のパターンとマッチングするソース文字列を指定する。

import re

# match()はソースの先頭がパターンになっているかをチェックする
result = re.match('You', 'Young Frankenstein')

# 先にパターンをコンパイルして、後で行うマッチングのスピードを上げることができる
youpattern = re.compile('You')
result = youpattern.match('Young Frankenstein')
  \mathrm{search}() 存在すれば最初のマッチを返す。
  \mathrm{findall}() 存在すれば重なり合わないすべてのマッチのリストを返す。
  \mathrm{split}() パターンにマッチしたところでソースを分割し、部分文字列のリストを返す。
  \mathrm{sub}() 置換文字列引数を取り、ソースのうち、パターンにマッチするすべての部分を置換文字列を返す。
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版が出ているものの初版しか持っていないのでこちらで。

プライバシーポリシー お問い合わせ