re模块
- findall***** 返回列表,找所有的匹配结果
- 语法:findall('正则表达式','待匹配字符串',flag)
- search***** 返回一个内存地址,这是一个正则匹配的结果span是索引,match是匹配结果,通过group取值;没有对应匹配结果就返回None,group会报错
- 语法:search(‘正则表达式’,‘待匹配字符串’)
- ret = re.search('d+','fdaf1123afda23')
- if ret: # 内存地址,这是一个正则匹配的结果
- print(ret.group())# 通过ret.group()获得真正的记过
- match** 相当于search的正则表达式汇总加了一个^,只能从头开始匹配
- ret = re.match('d+$','128fdasfd')
- print(ret)
- split** 返回列表,按照正则规则切割,默认去、匹配到的内容会被切掉
- ret = re.split('d+',s)
- print(ret)
- sub/subn** 替换,按照正则规则去寻找要被替掉的内容,subn返回元组,第二个值是替换的次数
- compile***** 编一个正则表达式,用这个结果去search、match、findall、finditer,能够节省时间
- ret = re.compile('正则') # 已经完成编译
- ret.findall('待匹配字符串')
- finditer***** 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存
ret = re.finditer('正则',’带匹配str‘)
for i in ret:
print(i.group())
findall:匹配所有每一项都是列表中的一个元素
1 import re 2 ret = re.findall('d+','qgadgeafd798a') #正则表达式,带匹配的字符串,flag 3 ret1 = re.findall('d','qgadgeafd798a') 4 print(ret) 5 print(ret1)
search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法获取结果,如果没有匹配到会返回None,使用group会报错
import re
ret = re.search('d+','qgadgeafd798a') if ret: print(ret) #返回内存地址,这是一个正则匹配的结果 print(ret.group()) #通过ret。group()获取真正的结果
math 从头开始匹配,相当于search中的正则表达式加上^
ret = re.match('d+','qgadgeafd798a') print(ret)
字符串处理的扩展:替换 切割
split 按照正则表达式的内容切割
s = 'alex83taibai40egon25' ret = re.split('d+',s) print(ret)
sub 替换 谁 旧的 新的 替换次数
ret = re.sub('d+','H','alex83taibai40egon25') print(ret)
subn 返回一个元组第二个元素是替换次数
ret = re.subn('d+','H','alex83taibai40egon25') print(ret)
re模块的进阶
compile 节省你是用正则表达式解决问题的时间,编译 将正则表达式编译成字节码,在多次使用过程中,不会多次编译
ret = re.compile('d+') print(ret) res = ret.findall('alex83taibai40egon25') print(res) ress = ret.search('alex83taibai40egon25') print(ress.group())
finditer 节省你是用正则表达式解决问题的空间
ret = re.finditer('d+','alex83taibai40egon25') print(ret) for i in ret: print(i.group())
import re s = '<a>wahaha</a>' # 标签语言html ret = re.search('<(w+)>(w+)</(w+)>',s) print(ret.group())#所有结果 print(ret.group(0))#所有结果 print(ret.group(1))#数字参数代表的是去对应分组中的内容 print(ret.group(2)) print(ret.group(3))
为了findall也可以顺利娶到分组中的内容,有一个特殊语法,就是优先显示分组中的内容
ret = re.findall('w+',s) print(ret) ret = re.findall('>(w+)<',s) print(ret)
取消分组优先(?:正则表达式)
ret = re.findall('d+(.d+)?','1.234*') print(ret)
关于分组
对于正则表达式来说,有些时候我们需要进行分组,来整体约束某一组字符出现的次数
(.[w]+)?
对于python语言来说,分组可以帮助你更好更精准的找到你真正需要的内容
<(w+)>w(w+)</(w+)>
split 添加分组()保留被切掉的正则表达式
ret = re.split('d+','alex83taibai40egon25') print(ret) ret = re.split('(d+)','alex83taibai40egon25') print(ret)
python和正则表达式之间的特殊约定
分组命名 (?P<这个组的名字>这则表达式)
s = '<a>wahaha</a>' ret = re.search('>(?P<con>w+)<',s) print(ret.group(1)) print(ret.group('con'))
s = '<a>wahaha</b>'
pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
ret = re.search(pattern,s)
print(ret)
你要匹配的内容太美有特点了,容易和你不想匹配的内容混在一起,精准的取到整数,过滤掉小数
import re ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #['1', '2', '60', '40', '35', '5', '4', '3'] ret=re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #['1', '-2', '60', '', '5', '-4', '3'] ret.remove("") print(ret) #['1', '-2', '60', '5', '-4', '3']
正则表达式如果写的足够好,能够最大限度的简化我们的操作
正则表达式到底重要到什么程度
掌握作业中的所有内容
能够看懂常用的正则表达式
并且能够做出一些公司特异性要求的修改
简单了解爬虫实例
import re import json from urllib.request import urlopen def getPage(url): response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): com = re.compile( '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) ret = com.finditer(s) for i in ret: yield { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num"), } def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num response_html = getPage(url) ret = parsePage(response_html) print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = str(obj) f.write(data + " ") count = 0 for i in range(10): main(count) count += 25