はてブロ@ama_ch

https://twitter.com/ama_ch

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にえいやっと貼り付けたらば、みごと次の問題へ!

感想

前回と問題の傾向が同じなので、サクサクでした。