python爬虫学习21

python爬虫学习21

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

目录

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

三、正则表达式

2.match

依照惯例,先把对照表附上来:

python爬虫学习21_第1张图片

2-3 贪婪与非贪婪

之前我们一同学习了match方法的匹配,但是我们有时候匹配到的内容却不是我们想要的结果:

# 贪婪与非贪婪
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))

运行结果:

python爬虫学习21_第2张图片

如此例,我们依旧想要获取字符串中间的数字,所以我们用(\d+)来匹配中间的数字这是没有问题的。数字的两侧东西太多了,想省事一下所以.*直接匹配。

但是这个时候我们最终匹配的结果只有一个数字,这是为什么呢?

这里就涉及了贪婪与非贪婪的问题。在贪婪机制下,点号星号会尽可能多的匹配更多的字符,我们的表达式中(\d+)代表了至少有一个数字而没有给出具体想要匹配多少数字,因此.*就会尽可能多的匹配字符,(你说至少有一个,那我就给你一个呗)这里就把123456都匹配走了。

那么怎样得到我们最终想要的结果呢?

# 我缓缓打出了一个问号
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))

运行结果:

在这里插入图片描述

在原表达式的基础上加入一个问号,就将匹配机制改为非贪婪,使得.*尽可能少的匹配字符。

所以,在做匹配的时候字符串的中间尽量使用非贪婪匹配,用.*?代替.*,以免出现匹配结果缺失的问题。

但是如果我们想要匹配的内容在字符串的末尾,那么.*?就可能会匹配不到内容,因为他会匹配尽可能少的内容

import re

content = '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爬虫学习21_第3张图片

2-4 修饰符
import re

content = '''Hello 1234567 
            World_This is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content)
print(result)
print(result.group(1))

还是之前的表达式,但是我们的内容换成了多行文字:

python爬虫学习21_第4张图片

怎么回事?发生什么事了?为什么报错

通过查阅对照表我们可以回想起.*只能匹配除了换行符的所有字符,所以我们这种万能方法就遇到了挑战。为了我们的偷懒大业,所以是时候引入修饰符了!

# 在原基础上只需要引入一个 re.S 参数即可

import re

content = '''Hello 1234567 
            World_This is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result)
print(result.group(1))

运行结果:

在这里插入图片描述

这种方法我们在网页的匹配中经常用到,因为HTML节点经常会有换行,加上它,就可以避免因为频繁换行引发的报错了。

修饰符附表:

python爬虫学习21_第5张图片

2-5 转移匹配

在编写表达式的过程中,我们已经知道.是用来匹配出换行以外的任意字符,那么当我们的表达式需要用到.作为一个普通符号的时候该怎么办呢?

# 转义匹配

import re

content = '(百度)www.baidu.com'
res = re.match('\(百度\)www\.baidu\.com', content)
print(res)

运行结果:

在这里插入图片描述

以上,关于match方法的常用内容,我们已经学习完了!

今日结束,明日…看情况吧

你可能感兴趣的:(Python爬虫基础学习笔记,python,爬虫,学习)