The Python Challenge Lv.3
Posted by Ross Wan 于 2011/08/20
Lv.3
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.
这关跟上一关一样,也是要解密网页源代码里的那一堆字符注释.根据上面的提示,要找出一些特殊的小写字母,它必须左右两边当且只有3个大字母,例如: bXXXaXXXc,字母a就符合要求.利用正则查找出这些字母来:
import re if __name__ == '__main__': with open('mess.txt') as f: target_chars = [] for line in f: target_chars.extend(re.findall(r'(?<=[^A-Z][A-Z]{3})[a-z](?=[A-Z]{3}[^A-Z])', '^'+line)) target = ''.join(target_chars) print('Target characters: %s' % target) print('Next url: http://www.pythonchallenge.com/pc/def/%s.html' % target) f.close()
‘^’+line 在每行开头加上字符”^”(或者其它非大写字母),是为了让正则表达式匹配这个特殊情况,就是行字符串开头如这样:XXXaXXXb…,如果不在行开头加上一个非大写字符,上面的正则表达式是配置不到a字符的.
另外,在论坛区里,有人贴出这样的正则表达式:
r'([^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]’
但它会漏掉一些应匹配的小写字符,例如: ‘aXXXbXXXcXXXd’, 上面的正则表达式只匹配到’b’,没有匹配到’c’!(虽然对于本关,它一样可以得出正确的结果 :<)
运行脚本,得到如下结果:
Target characters: linkedlist
Next url: http://www.pythonchallenge.com/pc/def/linkedlist.html
得到下一关的网址: http://www.pythonchallenge.com/pc/def/linkedlist.html
Have fun :>
发表评论