Python爬虫基础学习笔记|python爬虫学习21

python爬虫学习21 这是关于match未完下半部分,本来是想昨天…哎不说了
上半部分的传送门

目录

    • python爬虫学习21
      • 三、正则表达式
        • 2.match
          • 2-3 贪婪与非贪婪
          • 2-4 修饰符
          • 2-5 转移匹配

三、正则表达式
2.match 依照惯例,先把对照表附上来:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

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))

运行结果:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

如此例,我们依旧想要获取字符串中间的数字,所以我们用(\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))

运行结果:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

在原表达式的基础上加入一个问号,就将匹配机制改为非贪婪,使得.*尽可能少的匹配字符。
所以,在做匹配的时候字符串的中间尽量使用非贪婪匹配,用.*?代替.*,以免出现匹配结果缺失的问题。
但是如果我们想要匹配的内容在字符串的末尾,那么.*?就可能会匹配不到内容,因为他会匹配尽可能少的内容
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))

运行结果:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

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))

还是之前的表达式,但是我们的内容换成了多行文字:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

怎么回事?发生什么事了?为什么报错
通过查阅对照表我们可以回想起.*只能匹配除了换行符的所有字符,所以我们这种万能方法就遇到了挑战。为了我们的偷懒大业,所以是时候引入修饰符了!
# 在原基础上只需要引入一个 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))

运行结果:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

这种方法我们在网页的匹配中经常用到,因为HTML节点经常会有换行,加上它,就可以避免因为频繁换行引发的报错了。
修饰符附表:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

2-5 转移匹配 在编写表达式的过程中,我们已经知道.是用来匹配出换行以外的任意字符,那么当我们的表达式需要用到.作为一个普通符号的时候该怎么办呢?
# 转义匹配import recontent = '(百度)www.baidu.com' res = re.match('\(百度\)www\.baidu\.com', content) print(res)

运行结果:
Python爬虫基础学习笔记|python爬虫学习21
文章图片

以上,关于match方法的常用内容,我们已经学习完了!
今日结束,明日…看情况吧

    推荐阅读