Python网络爬虫学习笔记(三)正则表达式

正则表达式

正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证。

1 实例引入
正则表达式匹配 ,也就是用一定的规则将特定的文本提取出来 。
开源中国提供了正则表达式测试工具:
https://tool.oschina.net/regex/
例子:
Hello, my phone number is 010-86432100 and email is cqc@cuiqingcai.com, and my website is https://cuiqingcai.com.
在这里插入图片描述
在网页右侧选择“匹配 Email 地址”,就可以看到下方出现了文本中的email 。 如果选择“匹配网址 URL”,就可以看到下方出现了文本中的 URL。
在这里插入图片描述
Python 的 re 库提供了整个正则表达式的实现,利用这个库,可以在 Python 中使用正则表达式。

2. match()
match( )方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回None 。
例子:

import re
content ='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}', content)#正则表达式匹配
print(result)
print(result. group())
print(result. span())

开头的 ^是匹配字符串的开头,也就是以 Hello 开头;
然后\s匹配空白字符,用来匹配目标字符串的空格;
\d 匹配数字,3 个\d 匹配 123 ;
1 个\s 匹配空格 ; 后面还有 4567 ,可以依然用4 个\d来匹配,后面跟{4}代表匹配前面的规则 4 次;
\w{10}匹配 10 个字母及下划线
最后并没有把目标字符串匹配完,不过这样依然可以进行匹配,只不过匹配结果短一点而已
运行结果:
在这里插入图片描述
结果是 SRE_Match 对象,这证明成功匹配
该对象有两个方法: group()方法可以输出匹配到的内容; span( )方法可以输出匹配的范围,结果是(0,25)

·匹配目标
可以使用()括号将想提取的子字符串括起来 。()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用 group()方法传入分组的索引即可获取提取的结果。例子:

import re
content ='Hello 1234567 World_This is a Regex Demo'
print(len(content))
result = re.match ('Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

运行结果:
在这里插入图片描述
group(1)与 group ()有所不同,后者会输出完整的匹配结果,而前者会输出第一个被()包围的匹配结果

·通用匹配
有一个万能匹配可以用,那就是.*(点星)。 其中.(点)可以匹配任意字符(除换行符),*(星)代表匹配前面的字符无限次,所以它们组
合在一起就可以匹配任意字符了,有了它,就不用挨个字符地匹配了 。
例子:

import re
content = 'Hello 123 4567 World_This is a Regex Demo'
#将中间部分直接省略,全部用 . *来代替,最后加一个结尾字符串就好了
result = re.match('Hello.*Demo$', content)
print(result)
print(result.group())
print(result.span())

运行结果:
在这里插入图片描述
·贪婪与非贪婪
通用匹配:.*会匹配尽可能多的字符,是贪婪匹配

非贪婪匹配的写法是.*?,会尽可能匹配少的字符
例子:

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

result = re.match('Hello.*?(\d+).*Demo$', content)
print(result.group(1))

运行结果:
在这里插入图片描述
注意:如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符,例子:

content ='http://weibo.com/comment/kEraCN'
result = re.match('http.*?comment/(.*?)',content)

·修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式 。
在这里插入图片描述
re.S 在网页匹配中经常用到 。 因为 HTML 节点经常会有换行,加上它,就可以匹配节点与节点之间的换行了 。
在网页匹配中,较为常用的有 re.S 和出re.I 。

· 转义匹配
当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可 。 例如: .就可以用\.来匹配

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

3. search( )
search( )方法在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果 。 也就是说,正则表达式可以是字符串的一部分,如果搜索完了还没有找到,就返回 None。

4. findall( )
findall( )方法了会搜索整个字符串,然后返回匹配正则表达式的所有内容 。
如果只是获取第一个内容,可以用 search( )方法 。 当需要提取多个内容时,可以用于findall( )方法。

5. sub( )
如果想要把一串文本中的所有数字都去掉,如果只用字符串的 replace( )方法,那就太烦琐了,这时可以借助 sub( )方法。
例子:

import re
content ='54aKS4yrsoiRS4ixSL2g'
content = re.sub('\d+','', content)
print(content)

运行结果:
在这里插入图片描述
6. compile()
compile ()方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用 。
例子:

import re
contentl ='2016 12 15 12:00'
content2 ='2016-12-17 12:55'
content3 ='2016-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern,'',contentl)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2, result3)

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小零呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值