网站建设公司织梦模板,我做的网站怎么提升排名,贵阳网站如何推广,西安市高新规划建设局网站三、正则表达式
1、实例
模式描述\w匹配字母、数字以及下划线\W匹配不是字母、数字以及下划线\s匹配任意空白字符#xff0c;等价于[\t\n\r\f]\S匹配任意非空字符\d匹配任意数字#xff0c;等价于[0-9]\D匹配任意非数字的字符\A匹配字符串开头\Z匹配字符串结尾。如果存在换…三、正则表达式
1、实例
模式描述\w匹配字母、数字以及下划线\W匹配不是字母、数字以及下划线\s匹配任意空白字符等价于[\t\n\r\f]\S匹配任意非空字符\d匹配任意数字等价于[0-9]\D匹配任意非数字的字符\A匹配字符串开头\Z匹配字符串结尾。如果存在换号只匹配到换行符前的结束字符串\z匹配字符串结尾。如果存在换行同时还会匹配换行符\G匹配最后匹配完成的位置\n匹配一个换行符\t匹配一个制表符^匹配一行字符串的开头$匹配一行字符串的结尾.匹配任意字符除了换行符当re.DOTALL标记被指定时可以匹配包括换行符的任意字符[…]用来表示一组字符单独列出例如[amk]用来匹配a、m或k[^…]匹配不在[]中的字符例如匹配除了a、b、c之外的字符*匹配0个或多个表达式匹配1个或多个表达式?匹配0个或1个前面的正则表达式定义的片段非贪婪方式{n}精确匹配n个前面的表达式{n,m}匹配n次到m次由前面正则表达式定义的片段贪婪方式a|b匹配a或b()匹配括号内的表达式也表示一个组
2、match
常用的匹配方法–match向它传入要匹配的字符串以及正则表达式就可以检测这个正则表达式是否和字符串相匹配。match方法会从字符串的起始位置开始匹配正则表达式如果匹配返回匹配成功的结果否则None
import recontent Hello 123 4567 world_This is a Regex Demo
print(len(content)) # 41
result re.match(^Hello\s\d\d\d\s\d{4}\s\w{10},content)
print(result) # re.Match object...
print(result.group()) # Hello 123 4567 world_This
print(result.span()) # (0, 25)group方法可以输出匹配到的内容span方法可以输出匹配的范围
2.1、匹配目标
使用括号将想要提取的字符串括起来。实际上标记了一个子表达式的开始和结束位置被标记的每个子表达式依此对应每个分组调用group方法传入分组的索引即可获得提取结果。
content Hello 1234567 World_This is a Regex Demo
result re.match(^Hello\s(\d)\sWorld,content)
print(result) # re.Match object;...
print(result.group()) # Hello 1234567 World
print(result.group(1)) # 1234567
print(result.span()) # (0, 19)# 成功得到被括号括起来的1234567group()会输出完整的匹配结果而group(1)会输出第一个括号的匹配结果同理若还有括号可group(2)、group(3)...2.2、通用匹配
上述空白字符需要写\s匹配、数字\d匹配量大。因此万能匹配.* 其中.可以匹配任意字符(除换行符)*代表匹配前面字符无数次。改写上述代码
content Hello 123 4567 world_This is a Regex Demo
result re.match(^Hello.*Demo$,content)
print(result) # re.Match object...
print(result.group()) # Hello 123 4567 world_This is a Regex Demo
print(result.span()) # (0, 41)2.3、贪婪与非贪婪 贪婪匹配下、*.会匹配尽可能多的字符。 非贪婪匹配、.*?会匹配尽可能少的字符、但如果匹配的结果在字符串结尾则可能匹配不到任何内容。
import re
content Hello 1234567 World_This is a Regex Demo
result1 re.match(^He.*(\d).*Demo$,content)
result2 re.match(^He.*?(\d).*Demo$,content)
print(result1.group(1)) # 7
print(result2.group(1)) # 1234567# 贪婪匹配下、.*把123456都匹配了只剩下7给\d匹配。
# 非贪婪匹配下、.*?把1234567交给\d匹配。2.4、修饰符
当遇到换行符时.*?就不能匹配了。此时加上修饰符re.S即可修正。
import re
content Hello 1234567 World_This
is a Regex Demo
result re.match(^He.*?(\d).*?Demo$,content,re.S)
print(result.group(1)) # 1234567修饰符描述re.I使匹配对大小写不敏感re.L实现本地化识别locale-aware匹配re.M多行匹配影响^和$re.S使匹配内容包括换行符在内的所有字符re.U根据Unicode字符集解析字符这个标志会影响\w、\W、\b和\B\re.X该标志能够给予你更灵活的格式以便将正则表达式书写的便于理解
2.5、转义匹配
当目标字符串中遇到用作正则匹配模式的特殊字符时在 此字符前面加反斜杠\转义一下即可。
content (百度)www.baidu.com
result re.match(\(百度\)www\.baidu\.com,content)
print(result) # re.Match object; span(0, 17), match(百度)www.baidu.com2.6、search
**search方法在匹配时会扫描整个字符串然后返回第一个匹配成功的结果。**也就是说正则表达式可以是字符串的一部分。在匹配时search方法会依次以每个字符作为开头扫描字符串直到找到第一个符合规则的字符串然后返回匹配的内容。
content Extra stings Hello 1234567 World_This s Regex Demo Extra stings
result re.search(Hello.*?(\d).*?Demo,content)
print(result) # 12345672.7、findall
findall方法能获取与正则表达式相匹配的所有字符串。其返回的结果是列表类型需要通过遍历来依次获取每组内容。
# 上述代码改写
results re.findall(li.*?href(.*?).*?singer(.*?)(.*?)/a,html,re.S)
for result in results:# print(result)print(result[0],result[1],result[2])#/2.mp3 任贤齐 沧海一声笑
#/3.mp3 齐泰 往事随风
#/4.mp3 beyond 光辉岁月
#/5.mp3 陈慧琳 记事本
#/6.mp3 邓丽君 但愿人长久2.8、sub
除了使用正则表达式提取信息还可借助来修改文本。
content 54aK54yr5oiR54ix5L2g
content re.sub(\d,,content)
print(content)# aKyroiRixLg
# sub()方法中的第一个参数传入\d匹配所有数字第二个参数中传入把数字替换成的字符串第三个参数是原字符串。html re.sub(a.*?|/a,,html)
print(html)
results re.findall(li.*?(.*?)/li,html,re.S)
for result in results:print(result.strip())
# 一路上有你
#沧海一声笑
#往事随风
#光辉岁月
#记事本
#但愿人长久
# sub方法处理后a节点就没有了然后findall方法直接提取即可。2.9、compile
compile可以将正则表达式编译成正则表达式对象以便在后面的匹配中复用。可以说compile方法是给正则表达式做了一层封装。
content1 2019-12-15 12:00
content2 2019-12-17 12:55
content3 2019-12-22 12:55
pattern re.compile(\d{2}:\d{2}) # 去掉时间正则表达式
result1 re.sub(pattern,,content1) # 复用
result2 re.sub(pattern,,content2)
result3 re.sub(pattern,,content3)
print(result1,result2,result3)# 2019-12-15 2019-12-17 2019-12-22 四、httpx的使用*
有些网站强制使用HTTP/2.0协议访问这时urllib和reequests是无法爬取数据的因为它们只支持HTTP/1.1。
hyper和httpx是支持HTTP/2.0的请求库requests已有的功能它几乎都支持。
1、示例*
url https://spa16.scrape.center/
response requests.get(url)
print(response.text) # 报错无法访问2、安装
pip3 install httpx[http2]3、基本使用
GET请求
import httpxclient httpx.Client(http2True)
response client.get(https://spa16.scrape.center)
print(response.text)大多与requests相似
4.Client对象
Client对象的使用
with httpx.Client() as client:response client.get(https://www.httpbin.org/get)print(response) 声明client对象时可以指定一些参数
url https://www.httpbin.org/headers
headers {User-Agent:my-app/0.0.1}
with httpx.Client(headersheaders) as client:r client.get(url)print(r.json()[headers][User-Agent])5、支持HTTP/2.0
client httpx.Client(http2True)
response client.get(https://spa16.scrape.center)
print(response.text)6、支持异步请求
httpx还支持异步客户端请求即AsyncClient支持Python的async的请求模式
import httpx
import asyncioasync def fetch(url):async with httpx.AsyncClient(http2True) as client:response await client.get(url)print(response.text)
if __name__ __main__:asyncio.get_event_loop().run_until_complete(fetch(https://www.httpbin.org/get))