python正则表达式(2)-Python教程
本节我们来学习Python的内置re模块,re模块用于实现正则表达的操作,它里面提供了很多方法,例如search()、match()、findall()、split()、sub()等,下面我们依次进行学习。
1. search()方法
search方法在输入的字符串中查找,返回第一个匹配的内容,在找到之后返回match对象,未找到返回None。
语法格式如下:
1 | re.search(pattern,string,[flags]) |
pattern表示需要匹配的模式,即以正则表达式来转换string字符串,flags为标志位,用于控制匹配方式。
Flags常用参数如下:
1) A
对于\w、\b、\d等只进行ASCII匹配
2) I
匹配的时候不区分大小写
3) S
使用‘.’字符匹配所有字符
4) X
忽略字符串中为转移的空格及注释
我们通过例题来了解一下,代码如下:
1 2 3 4 | import re string = 'this is www.DOTcpp.com' pattern = r 'dotcpp' print (re.search(pattern,string,re.I)) #不区分大小写的方式匹配 |
输出结果为:
1 | <re.Match object ; span = ( 12 , 18 ), match = 'DOTcpp' > |
这个例子中我们以不区分大小写的方式在string字符串中搜索‘dotcpp’,输出的信息为它的位置及搜索信息。
2. match()方法
match方法从字符串的开始位置查询匹配内容,如果找到则返回一个match对象,未找到返回None。
语法格式如下:
1 | re.match(pattern,string,[flags]) |
具体参数同search相同,可以参看上面的内容。
如果我们把上面例子中的方法改为match,输出结果为None。
1 2 3 4 | import re string = 'this is www.DOTcpp.com' pattern = r 'dotcpp' print (re.match(pattern,string,re.I)) #不区分大小写的方式匹配 |
输出结果:
1 | None |
我们对代码进行修改,把正则表达式修改为字符串开始处的内容,代码如下:
1 2 3 4 | import re string = 'this is www.DOTcpp.com' pattern = r 'Th' print (re.match(pattern,string,re.I)) #不区分大小写的方式匹配 |
输出结果为:
1 | <re.Match object ; span = ( 0 , 2 ), match = 'th' > |
一定要注意search用法和match用法的区别,一般推荐大家使用research方法。
3. findall()方法
findall方法会在整个字符串中搜索出符合条件的字符串,然后以列表的形式返回。
语法格式如下:
1 | re.findall(pattern,string,[flags]) |
具体参数一致。
我们继续修改上面的代码来进行了解,我们把字符串中内容更改一下:
1 2 3 4 | import re string = 'this is www.DOTcpp.com dotcpp' pattern = r 'dotcpp' print (re.findall(pattern,string,re.I)) #不区分大小写的方式匹配 |
输出结果为:
1 | [ 'DOTcpp' , 'dotcpp' ] |
这种方式就匹配到了string字符串中所有符合pattern条件的内容,然后存放在一个列表中,也可以通过遍历的方式输出这些内容。
4. split()方法
split()方法又被称作分割方法,它能够以正则表达式的相关格式分割字符串,并返回列表,它的语法格式如下:
1 | re.split(pattern,string,[maxsplit],[flags]) |
这里多了一个maxsplit参数,用于表示最多的拆分次数,其余参数与上面一致。
我们通过最简单的例子来看一下:
1 2 3 | import restring = 'this is www.dotcpp.com ' pattern = r ' ' print (re.split(pattern,string,re.I)) 输出结果为: [ 'this' , 'is' , 'www.dotcpp.com ' ] |
我们通过通过分割把字符串中的信息存放到了一个列表中,此用法在学习中会经常用到。
还可以通过数字来分割字符串,例如:
1 2 3 4 | import re string = 'A123456B789C' pattern = r '\d*' print (re.split(pattern,string,maxsplit = 10 )) |
输出结果为:
1 | [' ', ' A ', ' ', ' B ', ' ', ' C ', ' '] |
在这个例子中,从输出结果可以看出通过数字分割了整个字符串,如果我们更改了\d*为\d?还会出现不同的内容,具体使用可以多多参考上一节的内容。
5. sub()方法
Sub方法可以替换字符串中的内容,语法格式如下:
1 | re.sub(pattern,repl,string,count,[flags]) |
repl为替换的字符串,count为替换的最大次数,默认为0,其余参数与上面一致。
我们在生活中经常会隐藏手机号的信息来保护隐私,我们通过sub方法来进行了解一下,代码如下:
1 2 | import restring = '号码为:18812345678' #假定手机号为18812345678pattern = r'\d'print(re.sub(pattern,'x', string)) |
输出结果为:
1 | 号码为:xxxxxxxxxxx |
这样就把我们输入的手机号内容给替换掉了。
6. 总结
关于正则表达式我们就简单的介绍到这里,实际上正则表达式中的内容还有很多,有兴趣的可以去参考re模块去进一步了解,上一节我们汇总的元字符结合这一节学习的几种方法,可以从字符串中筛选出各种各样的信息,大家可以通过下面习题进行简单的练习。
7. 习题
1. 匹配一个0-9之间任意数字
2. <div>中国</div>,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的
3. 字符串a = "not 404 found 编程 99 苏州 dotcpp",每个词中间是空格,用正则过滤掉英文和数字,最终输出"编程 苏州"
8. 题解
1. 代码:
1 2 3 4 5 | 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 ) |
输出:
1 | [ '13' , '122' , '95' , '669' , '132' , '072' , '093' ] |
2. 代码:
1 2 3 4 | import re string = '<div>中国</div>' test = re.findall(r '<div class=".*">(.*?)</div>' ,string) #.*?为提取文本 print (test) |
输出:
1 | [ '中国' ] |
3. 代码:
1 2 3 4 5 6 7 8 9 | 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) |
输出:
1 | 编程 苏州 |