python正则表达式实例代码
re模块使Python语言拥有全部的正则表达式功能。
会用到的语法
正则字符
释义
举例
+
前面元素至少出现一次
ab+:ab、abbbb等
*
前面元素出现0次或多次
ab*:a、ab、abb等
?
匹配前面的一次或0次
Ab?:A、Ab等
^
作为开始标记
^a:abc、aaaaaa等
$
作为结束标记
c$:abc、cccc等
\d
数字
3、4、9等
正则字符
释义
举例
+
前面元素至少出现一次
ab+:ab、abbbb等
*
前面元素出现0次或多次
ab*:a、ab、abb等
?
匹配前面的一次或0次
Ab?:A、Ab等
^
作为开始标记
^a:abc、aaaaaa等
$
作为结束标记
c$:abc、cccc等
\d
数字
3、4、9等
\D
非数字
A、a、-等
[a-z]
A到z之间的任意字母
a、p、m等
[0-9]
0到9之间的任意数字
0、2、9等
\D
非数字
A、a、-等
[a-z]
A到z之间的任意字母
a、p、m等
[0-9]
0到9之间的任意数字
0、2、9等
注意:
1.转义字符
>>>s '(abc)def' >>>m=re.search("(\(.*\)).*",s) >>>printm.group(1) (abc)
re.match函数
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
实例1:
#!/usr/bin/python #-*-coding:UTF-8-*- importre print(re.match('www','www.nhooo.com').span())#在起始位置匹配 print(re.match('net','www.nhooo.com'))#不在起始位置匹配
输出结果:
(0,3)
None
实例2:
#!/usr/bin/python importre line="Catsaresmarterthandogs" matchObj=re.match(r'(.*)are(.*?).*',line,re.M|re.I) ifmatchObj: print"matchObj.group():",matchObj.group() print"matchObj.group(1):",matchObj.group(1) print"matchObj.group(2):",matchObj.group(2) else: print"Nomatch!!"
输出结果:
matchObj.group():Catsaresmarterthandogs
matchObj.group(1):Cats
matchObj.group(2):smarter
上面是python2的print输出,python记得加()即可,python输出类似的别的语言的\n之类来匹配获取的内容。
pythongroup()
正则表达式中,group()用来提出分组截获的字符串,()用来分组
重复前边的字串多次
>>>a="kdlal123dk345" >>>b="kdlal123345" >>>m=re.search("([0-9]+(dk){0,1})[0-9]+",a) >>>m.group(1),m.group(2) ('123dk','dk') >>>m=re.search("([0-9]+(dk){0,1})[0-9]+",b) >>>m.group(1) '12334' >>>m.group(2) >>>
究其因
1.正则表达式中的三组括号把匹配结果分成三组
group()同group(0)就是匹配正则表达式整体结果
group(1)列出第一个括号匹配部分,group(2)列出第二个括号匹配部分,group(3)列出第三个括号匹配部分。
2.没有匹配成功的,re.search()返回None
3.当然正则表达式中没有括号,group(1)肯定不对了。
示例
1.判断字符串是否是全部小写
#-*-coding:cp936-*- importre s1='adkkdk' s2='abc123efg' an=re.search('^[a-z]+$',s1) ifan: print's1:',an.group(),'全为小写' else: prints1,"不全是小写!" an=re.match('[a-z]+$',s2) ifan: print's2:',an.group(),'全为小写' else: prints2,"不全是小写!"
结果
究其因
1.正则表达式不是python的一部分,利用时需要引用re模块
2.匹配的形式为:re.search(正则表达式,带匹配字串)或re.match(正则表达式,带匹配字串)。两者区别在于后者默认以开始符(^)开始。因此,
re.search('^[a-z]+$',s1)等价于re.match('[a-z]+$',s2)
3.如果匹配失败,则an=re.search('^[a-z]+$',s1)返回None
group用于把匹配结果分组
例如
importre a="123abc456" printre.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)#123abc456,返回整体 printre.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)#123 printre.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)#abc printre.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)#456
输出结果
123abc456
123
abc
456
1)正则表达式中的三组括号把匹配结果分成三组
group()同group(0)就是匹配正则表达式整体结果
group(1)列出第一个括号匹配部分,group(2)列出第二个括号匹配部分,group(3)列出第三个括号匹配部分。
2)没有匹配成功的,re.search()返回None
3)当然正则表达式中没有括号,group(1)肯定不对了。
2.首字母缩写词扩充
具体示例
FEMAFederalEmergencyManagementAgency
IRAIrishRepublicanArmy
DUPDemocraticUnionistParty
FDAFoodandDrugAdministration
OLCOfficeofLegalCounsel
分析
缩写词FEMA
分解为F***E***M***A***
规律大写字母+小写(大于等于1个)+空格
参考代码
importre defexpand_abbr(sen,abbr): lenabbr=len(abbr) ma='' foriinrange(0,lenabbr): ma+=abbr[i]+"[a-z]+"+'' print'ma:',ma ma=ma.strip('') p=re.search(ma,sen) ifp: returnp.group() else: return'' printexpand_abbr("WelcometoAlgricultureBankChina",'ABC')
结果
问题
上面代码对于例子中的前3个是正确的,但是后面的两个就错了,因为大写字母开头的词语之间还夹杂着小写字母词
规律
大写字母+小写(大于等于1个)+空格+[小写+空格](0次或1次)
参考代码
importre defexpand_abbr(sen,abbr): lenabbr=len(abbr) ma='' foriinrange(0,lenabbr-1): ma+=abbr[i]+"[a-z]+"+''+'([a-z]+)?' ma+=abbr[lenabbr-1]+"[a-z]+" print'ma:',ma ma=ma.strip('') p=re.search(ma,sen) ifp: returnp.group() else: return'' printexpand_abbr("WelcometoAlgricultureBankofChina",'ABC')
技巧
中间的小写字母集合+一个空格,看成一个整体,就加个括号。要么同时有,要么同时没有,这样需要用到?,匹配前方的整体。
3.去掉数字中的逗号
具体示例
在处理自然语言时123,000,000如果以标点符号分割,就会出现问题,好好的一个数字就被逗号肢解了,因此可以先下手把数字处理干净(逗号去掉)。
分析
数字中经常是3个数字一组,之后跟一个逗号,因此规律为:***,***,***
正则式
[a-z]+,[a-z]?
参考代码3-1
importre sen="abc,123,456,789,mnp" p=re.compile("\d+,\d+?") forcominp.finditer(sen): mm=com.group() print"hi:",mm print"sen_before:",sen sen=sen.replace(mm,mm.replace(",","")) print"sen_back:",sen,'\n'
结果
技巧
使用函数finditer(string[,pos[,endpos]])|re.finditer(pattern,string[,flags]):
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
参考代码3-2
sen="abc,123,456,789,mnp" while1: mm=re.search("\d,\d",sen) ifmm: mm=mm.group() sen=sen.replace(mm,mm.replace(",","")) printsen else: break
结果
延伸
这样的程序针对具体问题,即数字3位一组,如果数字混杂与字母间,干掉数字间的逗号,即把“abc,123,4,789,mnp”转化为“abc,1234789,mnp”
思路
更具体的是找正则式“数字,数字”找到后用去掉逗号的替换
参考代码3-3
sen="abc,123,4,789,mnp" while1: mm=re.search("\d,\d",sen) ifmm: mm=mm.group() sen=sen.replace(mm,mm.replace(",","")) printsen else: break printsen
结果
4.中文处理之年份转换(例如:一九四九年--->1949年)
中文处理涉及到编码问题。例如下边的程序识别年份(****年)时
#-*-coding:cp936-*- importre m0="在一九四九年新中国成立" m1="比一九九零年低百分之五点二" m2='人一九九六年击败俄军,取得实质独立' deffuc(m): a=re.findall("[零|一|二|三|四|五|六|七|八|九]+年",m) ifa: forkeyina: printkey else: print"NULL" fuc(m0) fuc(m1) fuc(m2)
运行结果
可以看出第二个、第三个都出现了错误。
改进——准化成unicode识别
#-*-coding:cp936-*- importre m0="在一九四九年新中国成立" m1="比一九九零年低百分之五点二" m2='人一九九六年击败俄军,取得实质独立' deffuc(m): m=m.decode('cp936') a=re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74",m) ifa: forkeyina: printkey else: print"NULL" fuc(m0) fuc(m1) fuc(m2)
结果
识别出来可以通过替换方式,把汉字替换成数字。
参考
numHash={} numHash['零'.decode('utf-8')]='0' numHash['一'.decode('utf-8')]='1' numHash['二'.decode('utf-8')]='2' numHash['三'.decode('utf-8')]='3' numHash['四'.decode('utf-8')]='4' numHash['五'.decode('utf-8')]='5' numHash['六'.decode('utf-8')]='6' numHash['七'.decode('utf-8')]='7' numHash['八'.decode('utf-8')]='8' numHash['九'.decode('utf-8')]='9' defchange2num(words): print"words:",words newword='' forkeyinwords: printkey ifkeyinnumHash: newword+=numHash[key] else: newword+=key returnnewword defChi2Num(line): a=re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74",line) ifa: print"------" printline forwordsina: newwords=change2num(words) printwords printnewwords line=line.replace(words,newwords) returnline
5.多个手机号码,中间用|隔开
举例:
空值
12222222222
12222222222|12222222222
12222222222|12222222222|12222222444
表达式
s="[\\d]{11}(\\|[\\d]{11})*|"
四.推荐
Python正则表达式指南
到此这篇关于python正则表达式实例代码的文章就介绍到这了,更多相关python正则例子内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。