Python写jio本入门知识学习笔记

Python写jio本入门知识学习笔记

Scroll Down

Python写jio本入门知识学习笔记

正则表达式

re模块
compile函数 根据一个模块字符串和可选标志参数生成一个正则表达式对象
基本步骤
compile->处理文本(match find findall)->匹配结果

模式描述
^匹配字符串的开头
$匹配字符串的末尾
.匹配任意换行符以外的字符
re*匹配前一个字符0次或多次
re?匹配一个字符0次或1次
re+匹配前一个字符1次或多次
[...]表示一组字符,单独列出 [abc]-> 'a','b','c'
re{n,m}匹配n次到m次有前面正则表达式定义的片段,贪婪方式
\d匹配任意数字 等价于[0-9]
\D匹配任意非数字
\w匹配字母数字及下划线
\W匹配非字母数字及下划线

start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置

正则表达式修饰符

修饰符描述
re.I使匹配对大小写不敏感
re.M多行匹配,影响^和¥
re.S使.匹配包括换行符在内的所有字符

注:标点符号匹配自身时需要用反斜杠\转义

贪婪与非贪婪

# \d+采用贪婪模式,直接把后面的0全匹配了,结果0*只能匹配空字符串
print(re.match(r'^(\d+)(0*)', '10000').groups())# ('10000', '')
print(re.match(r'^(\d+)(0*)', '10100').groups())# ('10100', '')
# \d+采用非贪婪匹配(尽可能少匹配)
print(re.match(r'^(\d+?)(0*)$', '10000').groups())# ('1', '0000')
print(re.match(r'^(\d+?)(0*)$', '10100').groups())# ('101', '00')
*、+、?限定符都是贪婪的

compile

re.compile(strPattern[, flag])
regex = r'规则'

pattern = re.compile(regex)
ret = pattern.match(string)

==>

ret = re.match(regex, string)

将字符串形式的正则表达式编译为Pattern对象
若正则表达式的字符串本身不合法会报错,且生成的对象可以重用

match

re.match(pattern, string , flags=0)#(匹配的正则表达式, 要匹配的字符串, 标志位)

Pattern.match(string[, pos[, endpos]])

可选参数pos:字符串中需要搜索的初始索引位,默认为零(从pos开始搜索)
可选参数endpos:搜索字符串截止位置
(搜索范围:[pos,endpos-1])

若字符串开头的字符与此正则表达式匹配,则返回相应的匹配对象
匹配成功则返回一个对象,否则返回None

print(re.match('www', 'www.baidu.com'))# <re.Match object; span=(0, 3), match='www'>
print(re.match('www', 'www.baidu.com').span())# (0, 3)
print(re.match('com', 'www.baidu.com')) # None 没从起始位置匹配到

也可以通过编译后+指定pos的方式

pattern = re.compile(r'com')
print(pattern.match('www.baidu.com')) # 不为开头,匹配不到
print(pattern.match('www.baidu.com', 10))# 指定位置后可以匹配到,c是第11个位置
# <re.Match object; span=(10, 13), match='com'>

group()

group(num) #匹配整个表达式的字符串,可以一次输入多个组号,返回一个包含那些组所对应值的元组

groups() # 返回一个包含所有组字符串的元组(1到所含组号)
line = "Oh! Python is so cool!"
word = re.match(r'(.*) is so (.*)', line, re.M | re.I)
print(word.group()) # Oh! Python is so cool!
print(word.group(1))# Oh! Python
print(word.group(2))# cool!
print(word.groups())# ('Oh! Python', 'cool!')

# group(0)也是原始字符串
re.search(pattern, string, flags=0)

pattern.search(string[, pos[, endpos]])

扫描整个字符串并返回第一个成功的匹配

import repattern = re.compile(("com"))print(pattern.search("www.baidu.com"))# <re.Match object; span=(10, 13), 
match='com'>

str = "www.baidu.com"
searchRet0 = re.search(r'(.*).baidu.(.*)', str)# <re.Match object; 
span=(0, 13), match='www.baidu.com'>
searchRet00 = re.search(r'(.*).baidu.(.*)', str).span()# (0, 13)

print(searchRet0.group())# www.baidu.com
print(searchRet0.groups())# ('www', 'com')

注:search和match的区别

match只匹配字符串的开始,search匹配整个字符串

spilt

re.split(pattern, string[, maxsplit=0, flags=0])

pattern.split(string, maxsplit=0)

显而易见地拆分字符串,可以根据正则表达式的规则进行拆分

pattern = re.compile(r'[\,\.]')
print(pattern.split("abc,eks.ooo"))
#['abc', 'eks', 'ooo']

print(re.split(r'[\,\.]',"abc,ekx.ooo"))

findall

findall(string[, pos[, endpos]])

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,找不到则返回空列表
(所以可以通过索引取出东西来啦)

一些常用实例

获取数字

regex = re.compile(r"\d+\.?\d*")

抓取标签间的内容

抓取超链接标签间的内容

requests

1.发送网络请求

r = requests.get("url")
r = requests.post("url")
r = requests.put("url")
r = requests.delete("url")
r = requests.head("url")
r = requests.options("url")

2.为url传递参数

import requests
payload = {'key1' : value, 'key2' : 'value2'}
r= requests.get('url', params=payload)
print(r.url) # 可以看到url?key2=value2&key1=value1

r = requests.post('url', data=payload)

3.响应内容

r = requests.get("url")
print(r.text)
print(r.encoding)
print(r.content)

4.请求头


几个案例?

Bugku-快速计算

import re
import requests
s = requests.Session()
r = s.get("http://47.102.107.100:39010/")
print(re.findall("<hr>(.*?)<hr>",r.text)[0])
d = { 
    "answer": eval(re.findall("<hr>(.*?)<hr>",r.text)[0])   
    }
r = s.post("http://47.102.107.100:39010/", data=d, headers=s.cookies)
print(r.text)