正则
#--Name: 正则 0x00 什么是正则表达式? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符, 以及这些特定字符的组合,组成一个 "规则字符串",这个 "规则字符串"用来 表达对字符串的一种过滤逻辑 特别需要注意的是: 正则表达式非Python独有,re模块实现 0x01 在线正则表达式测试 http://tool.oschina.net/regex/ 0x02 python中re模块 match 方法 #re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就会返回none re.match(pattern,string,flags=0) 0x03 re.match的相关实例 #最常规的匹配 import re content = 'Hello 123 4567 World_This is a Regex Demo' print(len(content)) result = re.match('^Hellosdddsd{4}sw{10}.*Demo$',content) print(result) print(result.group()) print(result.span()) #泛匹配 如果上面的匹配你觉得太过于冗长,那么可是使用泛匹配 ' .* ' import re content = 'Hello 123 4567 World_This is a Regex Demo' result = re.match('^Hello.*Demo$',content) print(result) print(result.group()) print(result.span()) #匹配目标 import re
content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^Hellos(d+)sWorld.*Demo$',content) print(result) print(result.group()) # 打印全部 print(result.group(1)) # 打印第1个括号内的匹配结果,如果表达式中有多个括号,第一个括号内的结果就是group(1) #第二个括号内的结果就是group(2),以此类推 print(result.span()) #贪婪匹配 使用 ' .* ' 尽可能匹配多的字符 import re
content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*(d+).*Demo$',content) print(result.group(1)) #非贪婪匹配 使用 ' .*? ' 尽可能匹配少的字符 import re
content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*?(d+).*Demo$',content) print(result.group(1))
#匹配模式 .* 除了换行符之外,可以匹配任意字符,需要匹配换行时,则需要指定 ' 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)) #转义 #用例1: 在不转意的情况下 import re content = 'price is $5.00' result = re.match('price is $5.00',content) print(result) #用例2: 加入转义 import re content = 'price is $5.00' result = re.match('price is $5.00',content) print(result) #总结: 在实际的使用中 尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就用 re.S 0x04 re.search 使用实例 #re.search 扫描整个字符串并返回第一个成功的匹配 #用例1: 使用re.match方法 import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.match('Hello.*?(d+).*?Demo',content) print(result) #用例2: 使用re.search方法 import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.search('Hello.*?(d+).*?Demo',content) print(result) print(result.group(1)) #总结: 为了匹配方便,在能用search方法的场景下,就不用match 0x05 匹配演练 #匹配1: 匹配 有active的li标签 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a> </li> </ul> </div>''' result = re.search("<li.*?active.*?singer='(.*?)'>(.*?)</a>",html,re.S) if result: print(result.group(1),result.group(2)) #匹配: 匹配第二个li标签 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a> </li> </ul> </div>''' result = re.search("<li.*?singer='(.*?)'>(.*?)</a>",result.group(2)) #匹配: 匹配有完整歌曲信息的第三个li标签 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'><i class='fa fa-user'></i>但愿人长久</a> </li> </ul> </div>''' result = re.search("<li.*?singer='(.*?)'>(.*?)</a>",html) if result: print(result.group(1),result.group(2)) 0x06 re.findall 使用实例 搜索字符串,以列表形式返回全部能匹配的子串 查询符合条件的所有结果 #匹配: 匹配出所有的歌曲链接 歌手名称 歌曲名称 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'>但愿人长久</a> </li> </ul> </div>''' results = re.findall("<li.*?href='(.*?)'.*?singer='(.*?)'>(.*?)</a>",re.S) print(results) print(type(results)) for result in results: print(result) #匹配: 匹配出所有有完整信息的歌曲名称 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'>但愿人长久</a> </li> </ul> </div>''' results = re.findall("<li.*?>s*?(<a.*?>)?(w+)(</a>)?s*?</li>",re.S) print(results) for result in results: print(result[1]) 0x07 re.sub 替换字符串中每一个匹配的字串后,返回替换后的字符串 #用例1: 把其中的数字替换掉 import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.sub('d+','',content) print(result) #用例2: 把其中的数字替换成指定内容 import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.sub('d+','这里以前是数字',content) print(result) #用例3: 被替换中的内容包含原内容的情况 import re content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' result = re.sub('(d+)',r'1 8910',content) #值得注意的是,由于第二个参数中插入了转义字符'',为了保证它的内容是原生内容,前面用了个 'r' #并且,前面的条件加了个小括号,也就是 group(1)的意思 print(result) #我们先把<a>标签替换掉,再用findall方法提取数据 #发现数据中存在换行符 n #我们再用 strip()方法去掉换行符 import re html = '''<div id='songs-list'> <h2 class='title'>经典老歌</h2> <p class='introduction'> 经典老歌列表 </p> <ul id='list' class='list-group'> <li data-view='2'>一路上有你</li> <li data-view='7'> <a href='/2.mp3' singer='任贤齐'>沧海一声笑</a> </li> <li data-view='4' class='active'> <a href='/3.mp3' singer='齐秦'>往事随风</a> </li> <li data-view='6'><a href='/4.mp3' singer='beyond'>光辉岁月</a></li> <li data-view='5'><a href='/5.mp3' singer='陈慧琳'>记事本</a></li> <li data-view='5'> <a href='/6.mp3' singer='邓丽君'>但愿人长久</a> </li> </ul> </div>''' html = re.sub("<a.*?>|</a>",html) print(html) results = re.findall("<li.*?>(.*?)</li>",re.S) print(results) for result in results: print(result.strip()) 0x08 re.compile,把字符串编译成正则表达式对象 #将一个正则表达式串编译成正则对象,以便于复用该匹配模式
#用例1: import re content = '''Hello 1234567 World_This is a Regex Demo''' pattern = re.compile('Hello.*Demo',re.S) #result = re.match('Hello.*Demo',re.S) #可以尝试上面的写法和下面的写法用法是一样的 #为什么要这么做? 这是为了便于以后的代码复用 result = re.match(pattern,content) print(result) 0x09 实战练习 #综合使用之前的方法 做一个豆瓣图书的爬取 import requests import re #该实例获取豆瓣图书的出版信息等等
#请写代码实现,获取链接url,书名,作者,出版日期,出版社,简介 #换行符号请使用 re.sub方法来实现 #要使用re.compile (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |