1.问题叙述
这个挑战的线索 源于源代码 观察 第三个挑战的图片可以得出 要确保一个小写字母周围要有三个大写字母当做保镖 类似 XXXxXXX 而且旁边只能有三个大写字母
NoEPPwXtRoVfGYIRyRgZWyJrMjuBQNchjZBNQUwSgIyXniXCMeXRfAcDKxskxYvMyRGyXeSlOFKFItyIFiUSskVfjqRXgqWOYHdDEWClkYXPjcAcuKkddJrDZqpFYYIlxACJHnfTTOUICdPhknncJRxdkMwSeSVSQdoxJeCJTcjDogRrnFsOIiHKlhyxucemEexjTFgKjdbffVxXqPQxLhdaawVKLxYRqeQGLhXqIeFykJUD
源代码最后部分都是类似这样的 所以我们需要找出 符合条件的小写字母
2 设计思路
这个挑战的代码我用到了 re urllib.request 这两个库 re模块是通过正则表达式 来进行小写字母的匹配 以及一开始 源代码部分的爬取 urllib.request 也是用于爬取时用到 所以思路如下我们先使用urllib.request.urlopen进行网页的打开 如果不使用read() 这个返回的就是一个HTTPResposne类型的对象 然而这个是无法使用decode进行解码的 这里的read其实就是HTTPResposne类型对象中的一个方法 使用read对HTTPResposne类型对象进行读写 然后再进行解码就可以爬取网页的源代码了 既然我们已经爬取下来了 接下来我们就需要使用正则表达式来进行匹配 这里需要两步 第一步就是我们先需要使用正则表达式把最后的那个都是字母的模块进行一个爬取 第二步就是我们要把这个模块里面的符合标准的小写字母爬取出来这样就可以得到我们的答案了
3代码解析
下面的这个代码就是一个模块的爬取的程序
import re
import urllib.request
html=urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data =re.findall('<!--(.*?)-->',html,re.DOTALL)[-1]
这个最后的-1 的意思就是选取这个区块里面的最后一个 正则表达式(.*?) 这个是非贪婪寻找 正则表达式 会进行搜取 <!-- 到-->这中间的所有字符以及选项 这里的问号就是非贪婪模式的意思 只要匹配到了一个-->就停止进行匹配 所以这样的话我们就可以把最后那块含有很多字符的模块进行一个爬取
当然最关键的时候也是需要进行正则表达式 我们需要通过正则表达式来进行匹配 完成题目的意思 一个小写字母旁边要有三个大写字母来当做保镖 所以意思就是 小写字母的旁边 最多只能有三个大写字母 所以正则表达式应该是如下 [a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z] 然后使用re.findall 就可以了 好了话不多说 直接上代码
import re
import urllib.request
html=urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data =re.findall('<!--(.*?)-->',html,re.DOTALL)[-1]
# 我们需要用到正则表达式 [A-Z][A-Z][A-Z][a-z][A-Z][A-Z][A-Z]
results =re.findall(r'[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]',data,re.DOTALL)
print("".join(results))
最后的答案就是linkedlist