退屈なことはPythonにやらせよう 第2版 読んでみた⑦
前回
今回からやっと「処理の自動化」というものに入る。
その一番初めの第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)
結果:ソロカラオケに行きたいし、グループカラオケも行きたい。
…覚えること多い。
次回、正規表現でなんかつくりたい。なんか。