2017/08/20
PyQ
今日は3単元
- クラスの基本
- 関数の詳細
- 正規表現
#今更だけど「単元」じゃなくて「クエスト」って呼び方があってるのか?
ようやくクラスまで来たけど、メソッドの定義の第一仮引数にselfを入れなきゃいけないのが不便だなぁ。普通にselfは予約語にしておいてくれればいいのに…(self入れ忘れで何度かエラー出した)
正規表現だと$を使った後方一致。厳密には後方一致じゃないんだろうけど、今までの正規表現と挙動が違っていて戸惑った。
>>> print(re.match('0$', '1000'))
None
>>> print(re.match('.+0$', '1000'))
<_sre.SRE_Match object; span=(0, 4), match='1000'>
PHPだとうまくいく。
C:\WINDOWS\system32>php -r "preg_match('/0$/', '1000', $match);var_dump($match);"
array(1) {
[0]=>
string(1) "0"
}
JSでもマッチしてくれる
'1000'.match(/0$/)
["0", index: 3, input: "1000"]
どちらが期待通りかといわれると後者で育った人間としては後者になるけど、言語としてそういうことならそういうこととして慣れるしかない。あとはpypiで入れられるregexモジュールも試してみよう。
あと、PyQのテストデータ大丈夫か心配になった。
「店舗名、商品名、価格」(、が区切り文字)のフォーマットで記載されたデータから正規表現でデータを引っこ抜いて「価格が1200円以上なら出力」のような条件を付けて処理を行う問題が出てきた。
この単元の最初に写経した際、「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」のように「、」が余分に入っているような不正なデータは無視すると記載があったため、「m = re.match('[^、]*、([^、]*)、(\d+)円$', data)」のような正規表現ではじいていたのだが、途中の問題で「不正なデータをはじく」要件が消えていた。
ということは、「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」のようなデータも無視せずに処理を行うよう正規表現を変更する必要があるはず。
とりあえず商品名に「、」が複数入っていても大丈夫なように「m = re.match('[^、]*、(.+)、(\d+)円$', data)」に変更したけど、問題がたまたま「1200円以上なら出力」という条件だったために、処理すべき「ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円」は処理されずに終わった。
どちらの正規表現で書いても最終的にこのデータは出力されないため、弾かれた体で合格になっていた。
実際に試してみたけどやっぱり写経した正規表現ではNG、新しい正規表現はOKになる。
>>> print(re.match('([^、]*)、([^、]*)、(\d+)円$', 'ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円').groups())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> print(re.match('([^、]*)、(.+)、(\d+)円$', 'ほげほげ、グリルドチキン、マッシュポテトを添えて、1000円').groups())
('ほげほげ', 'グリルドチキン、マッシュポテトを添えて', '1000')
問題作成者は「ほげほげ、グリルドチキン、マッシュポテトを添えて、1300円」のような条件式には当てはまりそうだけどフォーマットがNGなデータも作っておくべきだったということ。
まぁそこは学習の本質部分ではないと思うし、テストデータの抜け漏れは実務でもよくあるんだけど、こういう細かいところまでチェックできていないとなると実務レベルの単元ではどんなもんなのか不安になる。
すごい細かいことなんだけど、有料サービスだからこそ目に付いてしまう…。
サービス自体は続くといいなと思ってるし、なんなら他の言語バージョンも作ってほしいので、サービスの質が上がっていくことを願いつつ今日はこれにて終了。
---
白猫プロジェクトが捗りすぎて本全然読めていない…。