2019 7.1学习笔记
正则表达式补充:
^(脱字号):表示以...开始 (在match中使不使用都是一样的;如果在中括号中,那么代表是取反操作)
$:表示以...结束 必须要以XX结尾
|:匹配多个表达式或者字符
贪婪模式和非贪婪模式
贪婪模式:正则表达式会匹配尽量多的字符(默认为贪婪模式)
非贪婪模式:正则表达式会尽量少的匹配字符 ?
#text="<h1>标题</h1>" #ret=re.match('<.+?>',text) #print(ret.group()) #输出结果 : <h1>
# 匹配0-100的数字 # text="1001" # ret=re.match('[1-9][0-9]?$|100$',text) # print(ret.group())
re模块中常用的函数
group分组
# text="apple's price is $99,orange's price is $10" # ret=re.search('.*(\$\d+).*(\$\d+)',text) # print(ret.group()) #等价于print(ret.group(0)) # print(ret.group(1)) # print(ret.group(2)) # print(ret.groups()) #等价于print(ret.group(1,2))
findall
找到所有满足条件的,返回一个列表
sub
将匹配到的字符串换成其它字符串
re.sub(pattern, repl, string, count=0, flags=0)
split
按照能够匹配的子串将字符串分割后返回列表
compile
将正则表达式编译放在内存中 提高执行效率
# text="the number is 20.50" # r=re.compile(r""" # \d+ #小数点前的数字 # .? #小数点本身(可以不存在) # \d* #小数点后面的数字(可以不存在) # """,re.VERBOSE) # ret=re.search(r,text) # print(ret.group())
爬取古诗文网
import re import requests def parse_page(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" } response = requests.get(url, headers) text = response.text titles = re.findall(r'<div class="cont">.*?<b>(.*?)</b>', text, re.DOTALL) print(titles) dynasties = re.findall(r'<p class="source">.*?<a.*?>(.*?)</a>', text, re.DOTALL) authors = re.findall(r'<p class="source">.*?<a.*?<a.*?>(.*?)</a>', text, re.DOTALL) content_tags=re.findall(r'<div class="contson".*?>(.*?)</div>', text, re.DOTALL) contents=[] for content in content_tags: x=re.sub(r'<.*?>',"",content) contents.append(x.strip()) poems=[] for value in zip(titles,dynasties,authors,contents): title,dynastie,author,content=value poem={ 'title':title, 'dynastie':dynastie, 'author':author, 'content':content } poems.append(poem) for poem in poems: print(poem) print('='*40) def main(): for i in range(1,11): url= 'https://www.gushiwen.org/default_%s.aspx' %i parse_page(url) if __name__ == '__main__': main()
json
dump和dumps
person=[ { 'username':'张三','age':18}, { 'username':'李四','age':21}, { 'username':'王五','age':15} ] # json_str=json.dumps(person,ensure_ascii=False) #因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False with open('person.json','w',encoding='utf-8')as fp: # fp.write(json_str) json_str = json.dump(person,fp,ensure_ascii=False)
load和loads 同上正好相反