def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

退屈なことはPythonにやらせよう 第2版 読んでみた⑦

前回

 

defpediatric.hatenablog.com

今回からやっと「処理の自動化」というものに入る。

その一番初めの第7章は「正規表現を使ったパターンマッチ」

、、、あんまり面白くなさそう笑

 

正規表現(regular expression;regex)

正規表現はテキストパターンの記述法で、'\d'で数字1文字を表す。

他には

  • /D:0-9の数字以外
  • /w:文字、数字、下線
  • /W:文字、数字、下線以外
  • /s:スペース、タブ、改行
  • /S:スペース、タブ、改行以外
  • [ ]:独自の文字集合を入れることも可能
  • [\u3040-u309F]:ひらがな
  • [\u4E00-\u9fff]:漢字
  • ^:文字列の先頭にマッチ
  • $:文字列の末尾にマッチ
  • .:改行以外の文字

re.compile()

import re
phone_num_regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phone_num_regex.search("999-999-9999という電話番号を検索する関数")
print(mo.group())

re.compile()は正規表現を入力するとオブジェクトが返ってくる関数

 

※第二引数

第一引数に'.'、第二引数にre.DOTALLをつけると改行を含む全ての文字にマッチするようになる

第二引数にre.Iをつけると大文字小文字を無視するようになる

 

.search()でテキスト内の正規表現を検索できる。

↑を実行すると、

999-999-9999

となる。

ちなみにカッコをつけるとカッコだけ表示できる

phone_num_regex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
mo = phone_num_regex.search("999-999-9999という電話番号を検索する関数")
print(mo.group(1))
print(mo.groups())

実行すると

999
('999', '999', '9999') となる。

 

他には

cha_regex = re.compile(r'文字列1|文字列2')

で文字列1か文字列2(両方含まれる時は先に出た方)を検索

?をつけると、その文字があってもなくてもokな検索

camp_regex = re.compile(r'(ソロ)?キャンプ')
mo1 = camp_regex.search("ソロキャンプに行きたい")
mo2 = camp_regex.search("キャンプに行きたい")
print(mo1.group())
print(mo2.group())

実行すると

ソロキャンプ
キャンプ

 

特定の文字列が何回でも(0回でもok)出ていい時は*を用いる。

camp_regex = re.compile(r'(ソロ)*キャンプ')
mo1 = camp_regex.search("ソロソロソロソロソロソロキャンプに行きたい")
print(mo1.group())

実行すると

ソロソロソロソロソロソロキャンプ

 

ちなみに1回以上の場合は+を用いる

camp_regex = re.compile(r'(ソロ)+キャンプ')

繰り返し回数を指定する場合は{}を用いる

camp_regex = re.compile(r'(ソロ){2}キャンプ')

 

.findall 

.findall は当てはまるものをリストにして返す(グループにしているとタプルにして返す)

import re
camp_regex = re.compile(r'キャンプ')
mo = camp_regex.findall("ソロキャンプに行きたいし、グループキャンプも行きたい。")
print(mo)

実行すると、

['キャンプ', 'キャンプ']となる。

 

.sub()

.sub()は指定の文字列を置換できる

第一引数に置き換える文字列、第二引数は検索置換対象の文字列

import re
camp_regex = re.compile(r'キャンプ')
mo = camp_regex.sub('カラオケ', "ソロキャンプに行きたいし、グループキャンプも行きたい。")
print(mo)

結果:ソロカラオケに行きたいし、グループカラオケも行きたい。

 

 

…覚えること多い。

次回、正規表現でなんかつくりたい。なんか。