Python爬虫学习:Re模块

Python爬虫学习:Re模块

    • 正则表达式的基本语法
      • 常用元字符
      • 常用量词
      • 贪婪匹配与惰性匹配
    • re模块的一些方法
      • re.findall
      • re.finditer
      • re.search
      • re.match
      • re.compile
    • 其他小知识
      • 正则表达式在线测试平台
      • 给选择的分组起名字

正则表达式的基本语法

常用元字符

Python爬虫学习:Re模块_第1张图片

常用量词

Python爬虫学习:Re模块_第2张图片

贪婪匹配与惰性匹配

Python爬虫学习:Re模块_第3张图片
主要讲一下贪婪匹配和惰性匹配
贪婪匹配的原则就是从头开始,向后匹配直到最后一个匹配项,匹配后返回。
惰性匹配的原则就是从头开始,向后匹配直到第一个匹配项,匹配后返回。
举个例子:

s=re.finditer(r"(小.*游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
    print(i.group())

结果:
小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏

s=re.finditer(r"(小.*?游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
    print(i.group())

结果:
小明喜欢打游戏
小李喜欢打游戏
小王也喜欢打游戏

对结果的解释:正则匹配(小.*游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
正则匹配(小.*?游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
在系统中,匹配结果有三个:

  1. 小明喜欢打游戏
  2. 小明喜欢打游戏,小李喜欢打游戏
  3. 小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏
    .*匹配选择第三个结果并输出
    .*?选择第一个结果并输出

re模块的一些方法

re.findall

匹配字符串中所有的符合要求的内容。
返回值是列表。

lst=re.findall(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(lst)

结果:[‘11111’, ‘22222’]

re.finditer

匹配字符串中所有符合要求的内容。
返回值是迭代器。

it=re.finditer(r"\d+","我的电话号码是11111,你的电话号码是22222")
for i in it:
    print(i.group())

结果:11111 22222

re.search

从头开始匹配,匹配到第一个符合要求的则返回。
返回值时match对象,从中取数据需要使用.group1方法。

s=re.search(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(s.group())

结果:11111

re.match

以第一个字符为开始,向后匹配。
返回的是match对象,从中取数据需要使用.group1方法。

m=re.match(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(m.group())

这里Python会报错
在这里插入图片描述
显示没有匹配结果。因为match是从“我”开始匹配的,向后没有匹配到数字,返回空值。

改成以下的字符则会显示结果:

m=re.match(r"\d+","11111,你的电话号码是22222")
print(m.group())

结果:11111

re.compile

compile的作用是对正则表达式进行预加载,这样做可以提高之后匹配的效率

obj=re.compile(r"\d+")
s=obj.finditer("我的电话号码是11111,你的电话号码是22222")
for i in s:
    print(i.group())

结果:11111 22222

其他小知识

正则表达式在线测试平台

在开源中国上有一个在线的正则表达式测试平台:https://tool.oschina.net/regex
上面可以输入待匹配的文本和正则表达式,用于测试表达式的正确性。
Python爬虫学习:Re模块_第4张图片
网页右侧也给出了一些常用的正则表达式的例子,可以供参考
Python爬虫学习:Re模块_第5张图片

给选择的分组起名字

s="
小明
"
\ "
小王
"
\ "
小李
"
\ "
小周
"
#re.S的作用是让.能匹配换行符 #先加上括号,然后加上 ?P<分组名字>,之后就可以选定从该组中提取数据 obj=re.compile(r"
",re.S) result=obj.finditer(s) for i in result: print(i.group('rest1'),end=' ')

结果:
a b c d
解释:
正则匹配稍显复杂,目的就是提取class,从

就将结果记录到rest1分组中。
起别名的规则就是在需要起名字的地方先加一个括号(),括号里面加上?P,name表示自己取的名字。
在这个例子中,就是起了rest1名字。
起别名在爬虫中非常实用,当网页源代码很长,而我们想要提取的东西又十分多时,通过给各各分组起名字的方法,将每个分组分类,代码看起来显得很有条理。

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