Python3 网络爬虫开发实战 读书笔记(六)

3.3 正则表达式

正则表达式是处理字符串的强大工具,可以实现字符串的检索、替换、匹配验证。

1、基本语法规则

请添加图片描述

2、match()

作用:向它传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否匹配字符串。
match()方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,那么就返回匹配的结果,如果不匹配,就返回None。

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

输出结果:

<re.Match object; span=(0, 40), match='Hello 1234567 World This is a Regex Demo'>
1234567
(0, 40)

以上是通用匹配的写法,比较方便,主要学这种~
解释:result可以调用两种方法:
1、group():可以输出匹配到的内容,里面数字为几,那么就输出从左到右第几个括号内的内容~
2、span():可以输出匹配的范围。

语法补充~
**1、**如果只想要提取字符串中的一段内容,那么可以使用()括起来,那么就是一个分组。之后在group()中传入分组的索引,就可以获取相应的内容~
比如:group(1)输出第一个括号匹配的内容
2、.* 中 . 可以匹配任意字符(除了换行符), * 代表匹配前面的字符无限次,所以二者合在一起就可以匹配任意字符。
可以使用.*来简化正则表达式的书写~
3、 如果仅仅使用.*来简化正则表达式,那么就是贪婪匹配:

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

这里的result.group(1)只会输出7。
原因:.*为贪婪匹配,会尽量多地匹配字符,而\d+表示至少一个数字,那么.*就仅仅只会留一个数字,其他的全都匹配掉。
那么这个问题要怎么解决呢?
那就是使用.*?这样的非贪婪匹配。非贪婪匹配就是尽可能匹配少的字符,党匹配到Hello之后的空白字符时,再往后就是数字了,\d+就是正好匹配,所以这里.*?就不再匹配,交给\d+了

结论:在做匹配的时候,字符串中间尽量使用非贪婪匹配,也就是.*?来代替.*,以免出现匹配结果丢失

4、 修饰符
请添加图片描述

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

这里的字符串有换行符,无法使用.*?来正确匹配,所以需要使用修饰符——re.S——来匹配包括换行符在内的所有字符~
比较常用的有:re.S和re.I

5、 转义匹配:使用\来转义字符

3、search()

match()方法在使用时需要考虑到开头的内容,这在做匹配的时候并不方便,它更适合用来检测这个字符串是否符合某个正则表达式的规则。
search()会扫描整个字符串,然后返回第一个成功匹配的结果。

如果在HTML列表中使用search(),最好加上re.S修饰符,以免匹配不到的问题~

4、findall()

前面我们介绍了search()方法的用法,它可以返回匹配正则表达式的第一个内容,但是如果想要获取匹配正则表达式的所有内容,那就得用findall()方法了~
该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容~
如果有结果返回的话,那就是列表类型,之后可以用循环去遍历列表~

5、sub()

除了使用正则表达式提取信息之外,有时候可以使用它来修改文本~
比如:想把字符串中的所有数字都给去掉,如果只用字符串的replace()方法,那很繁琐,可以使用sub方法:

content = re.sub('\d+', '', contents)

第一个参数为匹配的字符(\d+为匹配所有的数字),第二个参数为替代的字符串(如果是‘’空字符串那么就是删除的作用),第三个参数是原字符串~

6、compile()

可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用哦~

content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:30'
content3 = '2016-12-22 12:40'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern,'',content1)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2,result3)
2016-12-15  2016-12-17  2016-12-22 

compile()方法就是给正则表达式做了一个封装,以便我们更好地复用~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

艾尔伯特想变瘦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值