前言
题目设计到正则表达试的运用
提示:以下是本篇文章正文内容,下面案例可供参考
一、知识补充
1.正则表达试补充
操作符 | 说明 |
---|---|
. | 表示任意一个字符 |
[ ] | 字符集:[abc]表示a,b,c [a-z]表示a到z26个字母 |
^ | 非:除了什么字符之外,^a除了a字符外 |
* | 前一个字符(0次或无限次)扩充,ac*表示a,ac,acc… |
+ | 前一个字符(1次或无限次)扩充,ac+表示ac,acc,accc… |
? | 前一个字符(0次或1次)扩充 |
{m} | 扩展一个字符m次,a{2}c表示:aac |
^ | 匹配字符串开头 |
$ | 匹配字符串的结尾 |
() | 分组标记,分组去匹配 |
\d | 任意数字(0-9) |
\w | 等价于[0-9A-Za-z_] |
2.re 函数介绍
- compile()函数:生成正则表达式对象,用来验证其他的字符串 : a= re.compile(‘a’) b= a.seach(‘abc’)如果匹配成功返回re.match对象,否则返回none 注:只返回第一次查找成功时的对象,只一次查找
- re.search(1,2)函数:1表示匹配的规则,2表示需要匹配的字符对象
a= re.search('avc','Aavc')
> 查找成功返回<re.Match object; span=(1, 4), match='avc'>
这里遵循左闭右开规则所以是(1,4)
- re.findall(1,2)函数 :用法同search,不同的是全局匹配返回列表
print(re.findall('aa','aadasdfaaadfadaa'))
返回['aa', 'aa', 'aa']
- 采用正则表达式,表示找到1次或者多次前字符是a,b,c的遇到不符合的字符截至
print(re.findall('[a-c]+','aacdasdfaaadfadaa'))
返回['aac', 'a', 'aaa', 'a', 'aa']
- re.sub(1,2,3)
print(re.sub('a','A','aadfvada') #找到3中字符a 用A替换
- 都可以用正则表达式来查找
二、web 19 解题过程
查看源码
</br>我感觉你得快点!!!<!-- OK ,now you have to post the margin what you find -->
尝试用bp
两次base64解码一下:
不可能折磨简单 刷新一下结果base64值发生了变化
果然对应题目: 得快点
看来得用脚本跑了
import requests
import base64
url = 'http://114.67.246.176:12073/'
r= requests.session() # 获取session对话
retun = r.get(url).headers #已经查到 flag在header里面
s=retun['flag']#获取flag里面base64值
a=base64.b64decode(s).decode().split(' ')[1] # 第一个base解码后面得到base值把前面的字符过滤掉
final=base64.b64decode(a).decode() #第二次base64解码
data={'margin':final}
print(r.post(url,data=data).text) #传值 post margin
三 .秋名山车神
题解过程与19相同
不同的是用到了正则表达式
获取值:r’(\d+[*-+])+(\d+) 表示:获取 整个表达式
> eval() 函数用来执行一个字符串表达式,并返回表达式的值。
import re
import requests
import urllib.request
url= 'http://114.67.246.176:11866/'
s = requests.session()
retuen = s.get(url)
print(retuen)
eql=re.search(r'(\d+[*\-+])+(\d+)',retuen.text).group()
result =eval(eql)
print(result)
key={'value':result}
print(s.post(url,data=key).text)
总结
部分正则表达式
用python脚本获取网页内容以及post数据
主要函数:
s= requests.session()
url=’’
return= s.get(url). # 可以获取header等信息
data={}
最后传值:s.post(data=data)