re模块下的常用方法
import re
ret = re.findall('d+(.d+)?', '1.23+2.34')
print(ret) 结果: ['.23','.34']
# findall的正则表达式里面有分组(),()里面的内容优先显示
ret = re.findall('d+(?:.d+)?', '1.23+2.34')
print(ret) 结果: ['1.23','2.34']
# ?:写在一个分组的最开始,表示在findall方法中取消这个分组的优先级
ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
print(ret) #结果 : ['a', 'a']
ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a' # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
ret = re.match('a', 'abc').group() # 同search,不过是在字符串开始处进行匹配,默认加'^',没有返回None
print(ret) #结果 : 'a'
ret = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd']
ret = re.split('d+','alex123wusir456')
print(ret) #['alex','wusir','']
ret = re.split('(d+)','alex123wusir456')
print(ret) #['alex','123','wusir','456','']
# split中如果带有分组(),会在分割的同时保留被分割内容中带分组的部分
ret = re.sub('d', 'H', 'eva3egon4yuan4', 1) #将数字替换成'H',参数1表示只替换1个
print(ret) # evaHegon4yuan4
ret = re.subn('d', 'H', 'eva3egon4yuan4') #将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret) #('evaHegonHyuanH',3)
obj = re.compile('d{3}') # 将正则表达式编译成为一个正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') # 正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer('d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 ret.__next__ == next(ret) print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果 3 4 7 8 4
综合练习与扩展
1、匹配标签
import re ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") #还可以在分组中利用?P<name>的形式给分组起名字 #获取的匹配结果可以直接用group('名字')拿到对应的值 print(ret.group('tag_name')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致 #获取的匹配结果可以直接用group(序号)拿到对应的值 print(ret.group(1)) # 结果:h1 print(ret.group()) #结果 :<h1>hello</h1>
2、匹配整数
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']
3、数字匹配
1、 匹配一段文本中的每行的邮箱 http://blog.csdn.net/make164492212/article/details/51656638 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’; 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,} 4、 匹配一个浮点数。 ^(-?d+)(.d+)?$ 或者 -?d+.?d* 5、 匹配汉字。 ^[u4e00-u9fa5]{0,}$ 6、 匹配出所有整数
4、爬虫练习
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 class="rating_num" .*?>(?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
flags有很多可选值: re.I(IGNORECASE)忽略大小写,括号内是完整的写法 re.M(MULTILINE)多行模式,改变^和$的行为 re.S(DOTALL)点可以匹配任意字符,包括换行符 re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用 re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
# 正则表达式 # 元字符 # 量词 # 小规则 # 贪婪和惰性匹配 # 分组命名 # 如果在匹配的时候遇到了没有特点的内容, # 只能通过匹配不想要的内容来从中摘取想要的内容 # findall和split的分组优先 # flags参数 # 每一小段规则的元素的排放顺序 # re模块 # 基础匹配 # 分割和替换 # 代码优化
# 模块 **** # 什么是模块? # py文件 # c语言编译之后的文件 # 写好的代码集合 直接调用它的功能 # import time # time.sleep() # 为什么要有模块? # 内存空间是有限的,存放在硬盘里,当你需要的时候加载到我的内存 # 把丰富的功能封装在一个文件里,等用的时候直接导入内存就可以使用 # 有哪些种类的模块? # 内置模块 # 扩展模块 # django # 安装 : pip3 install 模块名 # 自定义模块 # 登录 # 写日志 # 分模块: 功能独立防止代码过长