re模块的高级用法

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

格式:re.search(pattern, string, flags=0)

需求:匹配出文章阅读的次数

1
2
3
4
5
#coding=utf-8
import re

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()

运行结果:

1
'9999'

match()和search()的区别:

match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;

也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。

如:print(re.match(‘super’, ‘superstition’).span())   会返回(0, 5)

print(re.match(‘super’, ‘insuperable’))   则返回None

如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)

print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)

2. findall

re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

格式:re.findall(pattern, string, flags=0)

需求:统计出相应文章阅读的次数,转发次数,评论次数

1
2
3
4
5
#coding=utf-8
import re

ret = re.findall(r"\d+", "阅读次数:9999次,转发次数:883次,评论次数:3次")
print(ret)

运行结果:

1
['9999', '883', '3']

3. sub

使用re替换string中每一个匹配的子串后返回替换后的字符串。

格式:re.sub(pattern, repl, string, count)

需求:将匹配到的阅读次数加1

方法1:

1
2
3
4
5
#coding=utf-8
import re

ret = re.sub(r"\d+", "10000", "阅读次数:9999次,转发次数:883次,评论次数:3次")
print(ret)

运行结果:

1
阅读次数:10000,转发次数:10000,评论次数:10000

方法2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#coding=utf-8
import re

def add(temp):
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)

ret = re.sub(r"\d+", add, "python = 997")
print(ret)

ret = re.sub(r"\d+", add, "python = 99")
print(ret)

运行结果:

1
2
python = 998
python = 100

练习

image-20180618232840022

从下面的字符串中取出文本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<div>
        <p>岗位职责:</p>
<p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
<p><br></p>
<p>必备要求:</p>
<p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求:</p>
<p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p>
<p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
<p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p>
<p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p>
<p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
<p>&nbsp;<br></p>
<p>加分项:</p>
<p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p>

        </div>

参考答案:

1
re.sub(r"<[^>]*>|&nbsp;|\n| ", "", test_str)

image-20180619091226805

4. split

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

格式:re.split(pattern, string[, maxsplit])

需求:切割字符串“info:xiaoZhang 33 shandong”

1
2
3
4
5
#coding=utf-8
import re

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

运行结果:

1
['info', 'xiaoZhang', '33', 'shandong']