BC09百米(re模块)
和上一题类似,正则搜索字符串,处理数据计算出答案,提交.
题目 \
知识点一:regular expression
,我倾向于把它翻译为通用匹配规则,它的通常翻译
正则表达式,不够通俗易懂,听起来像是二次互反律、混沌动力学、豫解核、单纯剖分、共轭泛函、拓扑……
对于初学者来说,名字就给你吓尿了,这么难还学个屁啊~啊摔!……实际上一点都不复杂2333,就是为了描述字符串的形式的规定而已。
通用匹配规则,有两种符号,一种是普通符号,一种是特殊符号。
普通符号:a就是a,b就是b,T就是T,App就是App,不是aPP 也不是Spp。
特殊符号:\d 表示0,1,2,3,4,5,6,7,8,9
\w 表示A 、B、 C…… X 、Y 、Z …… a 、b、
c…… x、y、z…… 0、1、2…… 9
\s 表示 空白
\b 用法是 \bapp\b
表示app这个单词是单独的,不是sapp,不是apple。
| 表示或者
** . 点** 代表任何字符,除了\n 换行符\
* + ? {} 这四个符号代表数量,a*
表示a不存在或者**有很多a(aaaaaaaa),a数量>1 | =0
**
** a+** 表示有一个a 或者有很多a,a数量 >=1
** ?** 表示a数量 =0 | = 1
** { }** 花括号里面是数字,表达了出现的次数
[ ] 用法是表示可选项,2[1256 ] 表示
21、22、25或者26。\
^ …… $ 这里开头和结尾的符号
就表示字符串开始和结尾。^ 、$可以单独用,也可以一起用。
[ ^ ] 还表示排除,用法是[ ^ \d]
表示除了数字以外的字符。
先写出框架
::: {.image-package}
\
::: {.image-caption}
:::
:::
实验一下,表达式找出4位数字,19行:myre = '\d{4}' \
::: {.image-package}
\
::: {.image-caption}
发现几次都是1999,没有找到题目
:::
:::
::: {.image-package}
\
::: {.image-caption}
发现是找到第一个四位数就输出了
:::
:::
更改表达式为 myre = '\(\d{4}' 用反斜杠转义左括号,实验成功匹配
再次更改表达式myre = '\(\d{4}+',实验失败。。发现忘记了空格符号。
::: {.image-package}
\
::: {.image-caption}
:::
:::
后面加\s表达空格符号,之后是 '.{46}' \
点号表示任意符号,46表示有46个该符号。
::: {.image-package}
\
::: {.image-caption}
:::
:::
知识点二:字符替换,由于搜索出来的数字运算式子,其中的 x
,是英文小写字母而不是乘法*,所以要替换一下,再运算。
re.sub('原字符','替换字符串','要搜查TXT')\
知识点三:效率提升,将正则表达式预编译,可以提升搜查效率。
myre = re.compile(''\(\d{4}\s+.{46}'')
查看要提交的post,参数是pass_key,用计算出的答案提交\
::: {.image-package}
\
::: {.image-caption}
:::
:::
\
::: {.image-package}
\
::: {.image-caption}
:::
:::
还是失败了。思考了半响,明白了,这是由于第一次urllib获取HTML到本地,第二次request提交,每一次的题目都是不一样的。
也就是说我们把第一次的题目的答案给了第二次的题目,所以会出错。
用requests 获取网页内容,提交
::: {.image-package}
\
::: {.image-caption}
:::
:::
然而并没有什么卵用。。。。
我数了一下,十多秒…… 果然还是太慢了吗?
将第六行 char.content 改成 char.text
,因为content是逐字节读取,所以速度会慢。(已经成功在三秒之内了,但还是失败)
看别人答案。。。
::: {.image-package}
\
::: {.image-caption}
:::
:::
用session保持网页交互,使得题目和答案匹配,不会将第一次题目答案交给第二次访问的题目。
::: {.image-package}
\
::: {.image-caption}
:::
:::
:::
:::
:::