005 爬虫之正则表达式
来源:互联网 发布:知乎国外智慧城市案例 编辑:程序博客网 时间:2024/06/12 21:37
- 什么是正则表达式
- 正则表达式
- 常见匹配模式
- rematch从第一个字符开始匹配
- 最常规的匹配
- 泛匹配
- 匹配目标
- 贪婪匹配
- 非贪婪匹配
- 匹配模式
- 转义
- 总结
- research从扫描到的第一个开始匹配
- 总结
- 匹配演练
- refindall
- resub
- recompile
- 项目实战
1.什么是正则表达式
正则表达式就是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定的字符、以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
非Python独有,re模块实现
2.正则表达式
1.常见匹配模式
2.re.match(从第一个字符开始匹配)
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0)
1.最常规的匹配
import recontent = 'Hello 123 4567 World_This is a Regex Demo'print(len(content))result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$', content)print(result)print(result.group())print(result.span())
2.泛匹配
import recontent = 'Hello 123 4567 World_This is a Regex Demo'result = re.match('^Hello.*Demo$', content)print(result)print(result.group())print(result.span())
3.匹配目标
import recontent = 'Hello 1234567 World_This is a Regex Demo'result = re.match('^Hello\s(\d+)\sWorld.*Demo$', content)print(result)print(result.group(1))print(result.span())
如果正则表达式中出现了括号,那么第一个小括号里出现的内容可以用.group(1)代替,第二个小括号里出现的内容可以用.group(2)代替。
4.贪婪匹配
import recontent = 'Hello 1234567 World_This is a Regex Demo'result = re.match('^He.*(\d+).*Demo$', content)print(result)print(result.group(1))
贪婪模式中.*会匹配尽可能多的字符
5.非贪婪匹配
import recontent = 'Hello 1234567 World_This is a Regex Demo'result = re.match('^He.*?(\d+).*Demo$', content)print(result)print(result.group(1))
非贪婪模式中.*?匹配尽可能少的字符
6.匹配模式
import recontent = '''Hello 1234567 World_Thisis a Regex Demo'''result = re.match('^He.*?(\d+).*?Demo$', content, re.S)print(result.group(1))
.不能匹配换行符,加上re.S之后才可以匹配包括换行符在内的任意字符
7.转义
import recontent = 'price is $5.00'result = re.match('price is $5.00', content)print(result)
结果是 None 含有$符需要转义
import recontent = 'price is $5.00'result = re.match('price is \$5\.00', content)print(result)
加上转义符号(反斜杠\)即可匹配成功 在$和.前面都加上\
8.总结
尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S
3.re.search(从扫描到的第一个开始匹配)
re.search 扫描整个字符串并返回第一个成功的匹配。
import recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'result = re.match('Hello.*?(\d+).*?Demo', content)print(result)
用match方法不能匹配到
import recontent = '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方法可以匹配
1.总结
为匹配方便,能用search就不用match
2.匹配演练
import rehtml = '''<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))
result = re.search(‘
import rehtml = '''<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>'''result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html)if result: print(result.group(1), result.group(2))
result = re.search(‘
4.re.findall
搜索字符串,以列表形式返回全部能匹配的子串。
import rehtml = """<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>', html, re.S)print(results)print(type(results))for result in results: print(result) print(result[0], result[1], result[2])
results = re.findall(‘
import rehtml = """<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>', html, re.S)print(results)for result in results: print(result[1])
results = re.findall(‘
5.re.sub
替换字符串中每一个匹配的子串后返回替换后的字符串。
import recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'content = re.sub('\d+', '', content)print(content)
:Extra stings Hello World_This is a Regex Demo Extra stings
import recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'content = re.sub('\d+', 'Replacement', content)print(content)
:Extra stings Hello Replacement World_This is a Regex Demo Extra stings
import recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'content = re.sub('(\d+)', r'\1 8910', content) #\1 可以拿到匹配内容 print(content)
:Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings
import rehtml = '''<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>', html, re.S)print(results)for result in results: print(result.strip())
6.re.compile
将正则字符串编译成正则表达式对象,将一个正则表达式串编译成正则对象,以便于复用该匹配模式
import recontent = '''Hello 1234567 World_Thisis a Regex Demo'''pattern = re.compile('Hello.*Demo', re.S)result = re.match(pattern, content)#result = re.match('Hello.*Demo', content, re.S)print(result)
7.项目实战
通过re.findall和re.sub方法实现豆瓣读书的爬取
import requestsimport recontent = requests.get('https://book.douban.com/').text# print(content)parttern = re.compile('<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?author">(.*?)</span>.*?year">(.*?)</span>.*?</li>', re.S)results = re.findall(parttern, content)for result in results: url, name, author, date = result author = re.sub('\s','', author) date = re.sub('\s','', date) print(url,name,author,date)
- 005 爬虫之正则表达式
- Python爬虫之正则表达式
- python爬虫之正则表达式
- python爬虫之正则表达式
- python爬虫之正则表达式
- Python爬虫入门七之正则表达式
- python3爬虫之入门和正则表达式
- Python爬虫入门七之正则表达式
- python爬虫之神器正则表达式
- Python爬虫入门七之正则表达式
- 把玩之python爬虫正则表达式
- Java正则表达式之网页爬虫
- Python爬虫入门七之正则表达式
- Python爬虫入门七之正则表达式
- Python爬虫入门七之正则表达式
- Python爬虫入门七之正则表达式
- Python3爬虫之入门和正则表达式
- Python3爬虫之入门和正则表达式
- 开发板刷系统(X210V3S)
- android 仿微信图片选择器
- RabbitMQ消息队列(六):使用主题进行消息分发
- 解析IP分组
- Ubuntu16.04 install lsd-slam
- 005 爬虫之正则表达式
- [JZOJ5442]【NOIP2017提高A组冲刺11.1】荒诞([BZOJ3060]【POI2012】Tour de Byteotia)
- hdu 6092 Rikka with Subset(逆向01背包+思维)
- HEVC代码学习30:fillMvpCand函数
- 卡尔曼滤波的理解以及推导过程
- 线性表应用_约瑟夫环问题
- MT4函数_读取CSV格式文件存入到二维数组
- 5.4银行不同期限的年息利率
- Storm之——搭建Storm集群