踩坑日记(三)re.split()篇

在解析网页时,有一个需求是将网页内容按<h2>.*<h2>划分开,很容易想到,re.split()可以实现这一功能。

话不多说,我们进入正题:

import re

test_data = """
今天天气真不错
<h2>是的</h2>
真不错啊
真不错
"""

res = re.findall(r'<h2>.*</h2>', test_data, re.S)
print(res)

输出

['\n今天天气真不错\n', '\n真不错啊\n真不错\n']

很简单,实现了我们的需求。那么,我们再改一下test_data试试:

import re

test_data = """
今天天气真不错
<h2>是的
</h2>
真不错啊
真不错
"""

res = re.split(r'<h2>.*</h2>', test_data, re.S)
print(res)

输出:

['\n今天天气真不错\n<h2>是的\n</h2>\n真不错啊\n真不错\n']

仔细看,我们仅仅是添加了个换行,就导致我们写的正则表达式不起作用

我们把split换成findall试试:

import re

test_data = """
今天天气真不错
<h2>是的
</h2>
真不错啊
真不错
"""

res = re.findall(r'<h2>.*</h2>', test_data, re.S)
print(res)

输出:

['<h2>是的\n</h2>']

看起来findall是没问题的,我们看下re.S的作用
请添加图片描述
re.Sre.findall中是起了作用的,但在re.split就失效了,此时,我们已经明确了原因:

re.S未起作用

于是,我看了下re.split的函数说明:
请添加图片描述
请添加图片描述

我们是这样写的:res = re.split(r'<h2>.*</h2>', test_data, re.S)

发现问题了吗?我们将maxsplit参数设置为re.S

正确的写法应该是这样:

import re

test_data = """
今天天气真不错
<h2>是的
</h2>
真不错啊
真不错
"""

res = re.split(r'<h2>.*</h2>', test_data, flags=re.S)
print(res)

输出:

['\n今天天气真不错\n', '\n真不错啊\n真不错\n']

这时,有些同学可能会问:为什么findall可以正确提取呢?

我们来看下re.findall的函数说明:
请添加图片描述
可以看出,re.findall的第三个参数就是flags,所以,将re.S写在re.findall函数的第三个参数的位置是没有任何问题的。

那么,有没有更省心的办法呢?

当然有!!!!

我们使用re.compile函数:
请添加图片描述

import re

test_data = """
今天天气真不错
<h2>是的
</h2>
真不错啊
真不错
"""

pattern = re.compile(r'<h2>.*</h2>', re.S)

res = pattern.split(test_data)
print(res)

输出:

['\n今天天气真不错\n', '\n真不错啊\n真不错\n']

同样实现了我们的需求。

在日常开发中,在用到正则的地方,我们应养成使用re.compile编译正则表达式的好习惯,这样写不但可以避免犯这篇文章同样的错误,还能提升效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ToTensor

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

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

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

打赏作者

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

抵扣说明:

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

余额充值