python爬虫学习21 这是关于match未完下半部分,本来是想昨天…哎不说了
上半部分的传送门
目录
-
- python爬虫学习21
-
- 三、正则表达式
-
- 2.match
-
- 2-3 贪婪与非贪婪
- 2-4 修饰符
- 2-5 转移匹配
三、正则表达式
2.match 依照惯例,先把对照表附上来:
文章图片
2-3 贪婪与非贪婪 之前我们一同学习了match方法的匹配,但是我们有时候匹配到的内容却不是我们想要的结果:
# 贪婪与非贪婪
import recontent = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))
运行结果:
文章图片
如此例,我们依旧想要获取字符串中间的数字,所以我们用(\d+)来匹配中间的数字这是没有问题的。数字的两侧东西太多了,想省事一下所以.*直接匹配。
但是这个时候我们最终匹配的结果只有一个数字,这是为什么呢?
【Python爬虫基础学习笔记|python爬虫学习21】这里就涉及了贪婪与非贪婪的问题。在贪婪机制下,点号星号会尽可能多的匹配更多的字符,我们的表达式中(\d+)代表了至少有一个数字而没有给出具体想要匹配多少数字,因此.*就会尽可能多的匹配字符,(你说至少有一个,那我就给你一个呗)这里就把123456都匹配走了。
那么怎样得到我们最终想要的结果呢?
# 我缓缓打出了一个问号
import recontent = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))
运行结果:
文章图片
在原表达式的基础上加入一个问号,就将匹配机制改为非贪婪,使得.*尽可能少的匹配字符。
所以,在做匹配的时候字符串的中间尽量使用非贪婪匹配,用.*?代替.*,以免出现匹配结果缺失的问题。
但是如果我们想要匹配的内容在字符串的末尾,那么.*?就可能会匹配不到内容,因为他会匹配尽可能少的内容
import recontent = 'http://weibo.com/comment/KEracn'
res1 = re.match('^http.*?comment/(.*?)', content)
res2 = re.match('^http.*?comment/(.*)', content)print('.*?:', res1.group(1))
print('.*:', res2.group(1))
运行结果:
文章图片
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))
还是之前的表达式,但是我们的内容换成了多行文字:
文章图片
怎么回事?发生什么事了?为什么报错
通过查阅对照表我们可以回想起.*只能匹配除了换行符的所有字符,所以我们这种万能方法就遇到了挑战。为了我们的偷懒大业,所以是时候引入修饰符了!
# 在原基础上只需要引入一个 re.S 参数即可import recontent = '''Hello 1234567
World_This is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result)
print(result.group(1))
运行结果:
文章图片
这种方法我们在网页的匹配中经常用到,因为HTML节点经常会有换行,加上它,就可以避免因为频繁换行引发的报错了。
修饰符附表:
文章图片
2-5 转移匹配 在编写表达式的过程中,我们已经知道.是用来匹配出换行以外的任意字符,那么当我们的表达式需要用到.作为一个普通符号的时候该怎么办呢?
# 转义匹配import recontent = '(百度)www.baidu.com'
res = re.match('\(百度\)www\.baidu\.com', content)
print(res)
运行结果:
文章图片
以上,关于match方法的常用内容,我们已经学习完了!
今日结束,明日…看情况吧
推荐阅读
- Python爬虫基础学习笔记|python爬虫学习23
- python|python爬虫学习30
- Python爬虫基础学习笔记|python爬虫学习14
- #yyds干货盘点#python包
- Python求列表中最大,最小,第二大,第二最小值
- 使用 Sanic 框架进行 Python Web 开发
- #yyds干货盘点#List移除某个值remove - python基础学习系列
- Python Kivy .kv文件介绍和用法示例
- Python OpenCV仿射变换实现详细指南