Python Challenge Level3
※ネタバレ有り
考え方
タイトルが「re」だから明らかに正規表現(reモジュール)を使いそうですね。
いつも通り画像とその下のコメントを眺めます。
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.
和訳
ひとつの小文字が、3つのまさに大きなボディーガードに両側を囲まれています。
あー、正規表現で[大文字3つ][小文字1つ][大文字3つ]という感じの部分を探せばよさそう。
探す対象は恐らくソースにあるはず。
ソースを開くと・・・
<!-- kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT MUKLECKdCthezSYBpIElRnZugFAxDRtQPpyeCBgBfaRVvvguRXLvkAdLOeCKxsDUvBBCwdpMMWmuELeG 以下略
前回と同じような文字列がずら〜〜〜〜っと。よし、ここから探せば良いんだな!
回答
先ほどの文字列をlevel3-source.txtというファイルにコピペして、以下のコードを実行。
その1
#!/usr/bin/env python #! -*- coding: utf-8 -*- """ level 3 http://www.pythonchallenge.com/pc/def/equality.html """ import re f = open("level3-source.txt") text = f.read().replace("\n", "") f.close() ans = re.findall("[A-Z]{3}([a-z])[A-Z]{3}", text) print "".join(ans)
実行結果
$ python level3.py jfeiauzroivgzbmpszazlutnwsdofdbiwqdjbzshfrblqgsbyfdajygcblwjwggtdfjetobcmdlzxajvithecgpkcfwqqbvkoietpiijanvvqjjgtctpcadzjkgucmluaidgumlcdskunujfcjfmbzkzxsasdxsqqqlaeisjefjfdaolkjakypwxjtlhqjknednxunsahxqedoeqsdcmmhltcqsnwakjxtetaalhgabekfmyimwrkffydghiunlroiwgkudzsqljjbsixguytfsatejmdwkfbzifdknpacqimvehxujszmbuyutsompijcjojspbywlroefiwmrsjstdjhgwxhnthsoosmoqtmufoxvpvpjpkgiaqgfrhufxxdnjiwtfqusbkeakunqjgdkndpwiblklgjounivhgxsnekxjgrrbnslpuaouvhzabilbimrmqqxtktgcnkdljoashnekxwtsgvzwjaehgurnksokjtrovpmygkzgeolwysfiodemflmkwmj
うおお、ヒットしすぎw
何か条件が足りないのかな?もう1度説明を読み直してみよう。
surrounded by EXACTLY three big bodyguards
EXACTLYと強調しているのはあれか、「きっかり3文字」ってことかな?この正規表現だと大文字が「少なくとも」3文字で小文字を挟んでいればヒットしちゃうからね。
修正してみた(その2)
#!/usr/bin/env python #! -*- coding: utf-8 -*- """ level 3 http://www.pythonchallenge.com/pc/def/equality.html """ import re f = open("level3-source.txt") text = f.read().replace("\n", "") f.close() ans = re.findall("[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]", text) print "".join(ans)
実行結果
$ python level3.py linkedlist
先ほどの正規表現の両側を[^A-Z]で挟んでやりました。
なかなかよさげな文字列が出てきましたね!
こいつをURLにえいやっと貼り付けたらば、みごと次の問題へ!
感想
前回と問題の傾向が同じなので、サクサクでした。