本节我们来学习Python的内置re模块,re模块用于实现正则表达的操作,它里面提供了很多方法,例如search()、match()、findall()、split()、sub()等,下面我们依次进行学习。

1. search()方法

        search方法在输入的字符串中查找,返回第一个匹配的内容,在找到之后返回match对象,未找到返回None。

        语法格式如下:

re.search(pattern,string,[flags])

        pattern表示需要匹配的模式,即以正则表达式来转换string字符串,flags为标志位,用于控制匹配方式。

        Flags常用参数如下:

        1) A

        对于\w、\b、\d等只进行ASCII匹配。

        2) I

        匹配的时候不区分大小写。

        3) S

        使用‘.’字符匹配所有字符。

        4) X

        忽略字符串中为转移的空格及注释。

        我们通过例题来了解一下,代码如下:

import re
string = 'this is www.DOTcpp.com'
pattern = r'dotcpp'
print(re.search(pattern,string,re.I))#不区分大小写的方式匹配

        输出结果为:

<re.Match object; span=(12, 18), match='DOTcpp'>

        这个例子中我们以不区分大小写的方式在string字符串中搜索‘dotcpp’,输出的信息为它的位置及搜索信息。

2. match()方法

        match方法从字符串的开始位置查询匹配内容,如果找到则返回一个match对象,未找到返回None。

        语法格式如下:

re.match(pattern,string,[flags])

        具体参数同search相同,可以参看上面的内容。

        如果我们把上面例子中的方法改为match,输出结果为None。

import re
string = 'this is www.DOTcpp.com'
pattern = r'dotcpp'
print(re.match(pattern,string,re.I))#不区分大小写的方式匹配

        输出结果:

None

        我们对代码进行修改,把正则表达式修改为字符串开始处的内容,代码如下:

import re
string = 'this is www.DOTcpp.com'
pattern = r'Th'
print(re.match(pattern,string,re.I))#不区分大小写的方式匹配

        输出结果为:

<re.Match object; span=(0, 2), match='th'>

        一定要注意search用法和match用法的区别,一般推荐大家使用research方法。

3. findall()方法

        findall方法会在整个字符串中搜索出符合条件的字符串,然后以列表的形式返回。

        语法格式如下:

re.findall(pattern,string,[flags])

        具体参数一致。

        我们继续修改上面的代码来进行了解,我们把字符串中内容更改一下:

import re
string = 'this is www.DOTcpp.com dotcpp'
pattern = r'dotcpp'
print(re.findall(pattern,string,re.I))#不区分大小写的方式匹配

        输出结果为:

['DOTcpp', 'dotcpp']

        这种方式就匹配到了string字符串中所有符合pattern条件的内容,然后存放在一个列表中,也可以通过遍历的方式输出这些内容。

4. split()方法

        split()方法又被称作分割方法,它能够以正则表达式的相关格式分割字符串,并返回列表,它的语法格式如下:

re.split(pattern,string,[maxsplit],[flags])

        这里多了一个maxsplit参数,用于表示最多的拆分次数,其余参数与上面一致。

        我们通过最简单的例子来看一下:

import restring = 'this is www.dotcpp.com 'pattern = r' 'print(re.split(pattern,string,re.I))
输出结果为:
['this', 'is', 'www.dotcpp.com ']

        我们通过通过分割把字符串中的信息存放到了一个列表中,此用法在学习中会经常用到。

        还可以通过数字来分割字符串,例如:

import re
string = 'A123456B789C'
pattern = r'\d*'
print(re.split(pattern,string,maxsplit=10))

        输出结果为:

['', 'A', '', 'B', '', 'C', '']

        在这个例子中,从输出结果可以看出通过数字分割了整个字符串,如果我们更改了\d*为\d?还会出现不同的内容,具体使用可以多多参考上一节的内容。

5. sub()方法

        Sub方法可以替换字符串中的内容,语法格式如下:

re.sub(pattern,repl,string,count,[flags])

        repl为替换的字符串,count为替换的最大次数,默认为0,其余参数与上面一致。

        我们在生活中经常会隐藏手机号的信息来保护隐私,我们通过sub方法来进行了解一下,代码如下:

import restring = '号码为:18812345678'#假定手机号为18812345678pattern = r'\d'print(re.sub(pattern,'x',
string))

        输出结果为:

号码为:xxxxxxxxxxx

        这样就把我们输入的手机号内容给替换掉了。

6. 总结

        关于正则表达式我们就简单的介绍到这里,实际上正则表达式中的内容还有很多,有兴趣的可以去参考re模块去进一步了解,上一节我们汇总的元字符结合这一节学习的几种方法,可以从字符串中筛选出各种各样的信息,大家可以通过下面习题进行简单的练习。

7. 习题

        1. 匹配一个0-9之间任意数字。

        2. <div>中国</div>,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的。

        3. 字符串a = "not 404 found 编程 99 苏州 dotcpp",每个词中间是空格,用正则过滤掉英文和数字,最终输出"编程  苏州"。

8. 题解

        1. 代码:

import re
string="""13\n122\n95\n669\n132\n072\n093\n4d"""
test = re.compile('(?<![0-9])[0-9]{1,3}(?!\w)')
t = test.findall(string)
print( t )

        输出:

['13', '122', '95', '669', '132', '072', '093']

        2. 代码:

import re
string = '<div>中国</div>'
test = re.findall(r'<div class=".*">(.*?)</div>',string)#.*?为提取文本
print(test)

        输出:

['中国']

        3. 代码:

import re
string = 'not 404 found 编程 99 苏州 dotcpp'
list = string.split(' ')
test = re.findall('\d+|[a-zA-Z]+',string)
for i in test:
    if i in list:
        list.remove(i)
new = ' '.join(list)
print(new)

        输出:

编程 苏州


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)