【Python】正規表現で作る「お年玉年賀はがき」当せんチェッカー
目視で確認した方が速いかもしれませんが、Pythonで年賀状に付いているお年玉はがきの当選を確認するコードを作ったのでご紹介します。
正規表現を用いた方法ですので応用すれば他のプログラム言語でも動くと思います。
import re ok_pattern = re.compile(r"^\d{6}$") # 六桁の数字か確認 win1_pattern = re.compile(r"^770102$") # 一等賞 win2_pattern = re.compile(r"^\d{2}1208$") # 二等賞 win3_pattern = re.compile(r"^\d{4}(02|50|54)$") # 三等賞 while True: res = input(">>>>>>") if ok_pattern.fullmatch(res): if win1_pattern.fullmatch(res): print("一等です!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") elif win2_pattern.fullmatch(res): print("二等です") elif win3_pattern.fullmatch(res): print("三等です") else: print("残念...") elif res == "fin": print("プログラムを終了します") break else: print("六桁の数字ではありません")
赤文字は2022年の当選番号。ご自身でも確認お願いします。
一応、今年の年賀状の当選番号をもとにして作りましたが、数字部分を書き変えれば来年も使えると思います。
私は結構おっちょこちょいなんでもしかしたら当選番号を間違えてこちらに掲載している可能性もあるので要チェックお願いします。ちなみに記事は2022年に作成。
解説
もっと工夫できる部分はあるような気がしますが、とりあえずinput関数で入力された番号を読み取ります。
input関数の戻り値は文字列型なので、そのまま正規表現で判定できるのが嬉しいです。
今回、正規表現は全部で4つ使います。
- 一等賞の判定
- 二等賞の判定
- 三等賞の判定
- そもそも6桁の番号になっているのかの判定
全てのパターンには一応、「先頭を意味する^」と「最後尾を意味する$」を付けときました。完全一致しているか判断するfullmatch関数を利用するのでちょっと不要な感じもします。
一等賞の判定については単純で一等賞の番号を使うだけ。全六桁が一致するか確認します。
re.compile(r"^770102$")
二等賞は下四桁で当選番号が決まります。ここからは「数字を意味する正規表現\d」と「指定した回数の連続を意味する{指定回数}」を利用します。
re.compile(r"^\d{2}1208$")
つまり2連続の数字と当選番号の数字が4つってことですね。
次が三等賞のパターン。これが一番複雑。
re.compile(r"^\d{4}(02|50|54)$")
最初の4桁の数字は二等賞の時と一緒です。
丸括弧の中を縦棒で区切ることで「OR(いずれか)」という意味になります。
三等賞は嬉しいことに下二桁の当選番号の候補が3つあるので、この方法を使うんですね。
fullmatch関数の戻り値は一致しないときはNoneで返ってくるのでif文で判定できるのです。
まとめ
工夫次第でもっとスマートかつ便利なプログラムが作れると思います。
みなさんもお年玉年賀はがきをチェックしてみてください。
ちなみに私は三等一枚の当選でした。残念...