python正则表达式(2)-Python教程
本节我们来学习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)
输出:
编程 苏州