设为首页 收藏本站
查看: 1081|回复: 0

[经验分享] 学习正则表达式在python中的应用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-8-14 09:42:19 | 显示全部楼层 |阅读模式
  目的:对文本的处理,正则表达式的功能很强大,可以很巧妙的过滤、匹配、获取想要的字符串,是必须学习的技能,这里只记录常用的写法,详细文档可以参看官方帮助文档。
  环境:ubuntu 16.04    python 3.5
  在python中使用正则表达式首先要导入re模块
import re  在re模块中有几个常用的函数:
  re.compile('value')
  它会返回一个正则表达式regex对象,作用是对预编译提速,且第二个参数支持一些方法,把它返回给一个变量方便重复使用,函数有两个参数:匹配表达式和第二个可选参数:
  匹配表达式即,正则表达式的写法,因为表达式中常用\符号,所以一般第一个参数下载r''内,r表示引号内为自然字符,python不对内部做转义,这样正则表达式用转义时不用多加一个\,如:r'\d',\d在正则中是匹配一个数字,如果没有r则要写成'\\d',这样很麻烦且不易阅读。
  最简单的匹配:r'haha'匹配字符'haha',但不匹配'hehe',可以使用通配符,下面介绍:
  常用通配符:
  \d表示一个数字
  \w表示字母、数字、下划线中任意一个,且在python3中支持匹配一个汉字。
  \s表示空格、制表符和换行中任意一个。
  \D, \W, \S是他们的非模式。
  ^匹配字符串起始位置,当^在方括号内是表示非模式,[^a-z]小写26个字母以外。
  $匹配字符串结尾位置。
  \b表示一个字符旁空格的位置,'it is a good job', \bgoog\b匹配good,而不会匹配goods等其他。
  | 竖杠表示或,如\d|\d{2},匹配一个数字或两个数字。
  自定义通配符:
  [a-z]表示小写a到z的26个字母中任意一个
  []中括号模式可以包含很多,比如:[a-zA-Z0-9_]这个就是\w(只在python2中相等),还可以想这样[aeiou]只包含想要匹配的,或者特殊符号[._-],需要转义的要加上\。
  以上都是只匹配符合的一个,下面学习数量:
  匹配最少:{5} 表示5次,{1,5}表示1次到5次都可以,{1,}省略后面的表示至少1次。
  贪婪匹配:+等同于{1,},*表示可无或更多,?表示一次或更多,.点表示就是\S,这里都会匹配多的结果,因为是贪婪模式。
  限制贪婪:在贪婪模式后面加上?表示限制贪婪,匹配最少,+会尽量匹配多的,+?匹配一个。
numRegex = re.compile(r'\d{11}')  
# 生成匹配11位数字的正则对象,\d是数字,{11}代表11次
  re.compile()的第二个参数有:re.VERBOSE, re.IGNORECASE和re.DOTALL,后面要大写。
  re.VERBOSE表示匹配中可以多行且有注释,在复杂的正则对象中使用。
re.compile(r'''(  
    \d        #匹配一个数字
  
    \w        #匹配一个字符
  
)''', re.VERBOSE)
  re.IGORECASE表示匹配不区分大小写:
re.compile(r'[a-z]', re.IGORECASE)  这个即可以匹配a,也可以匹配A。
  re.DOTALL表示允许.匹配包括\s的内容
re.compile(r'.*', re.DOTALL)  匹配所以内容。
  匹配方法:search(), match(), findall(), finditer()
  这些是匹配规则查找方法,也可以直接把正则表达式写在他们的第一个参数的位置(测试时可以,正式编写不推荐,理由在上面的compile中)而不用compile(),第二个参数是需要匹配的字符串,如
re.search(r'\d+', 'aa123abc')  返回123
  search()方法
  search()方法进行全字符搜索,返回的是第一个符合条件的match对象,并且它只返回一个,即使后面有其他符合条件的,也不处理,没有则返回None。
aa = re.compile(r'\d\d\d+')  
bb = aa.search('aa12345abc678')
  bb得到返回的包含12345的match对象,而没有678
  match()方法
  match()方法从字符串开始处就匹配,且只返回一个符合条件的match对象,相当于正则表达式以r'^开始,匹配也只返回开始部分,没有则返回None。
aa = re.compile(r'\d+')  
bb = aa.search('123ab45')
  bb得到返回的包含123的match对象,没有45,且如果字符串变成'a123ab45',则返回None。
  findall()方法
  findall()方法进行全字符搜索,返回所有符合条件的值,然后组成列表,即返回一个列表对象,没有则为空列表。
aa = re.compile(r'\d+')  
bb = aa.findall('a123b45c678')
  bb得到返回的的列表['123', '45', '678']
  finditer()方法
  finditer()方法进行全字符串搜索,返回所有符合条件的match对象,然后组成迭代器,用for方法可以看出迭代器里面是match对象。
  这里match对象有group(), group(index)和groups()方法
  可使用它们调用返回的match对象,group()和group(0)都是得到母值,groups()返回所有group(index)组成的元组。
  分组和捕获
  在正则表达式中使用圆括号()会产生分组,每个组都是元素,返回一个元组对象,可用group()获取对于序号的元素:
numRegex = re.compile(r'(\d)(\d)(\d)')  当圆括号内左边使用?:表示不分组、不捕获,如:(?:\d)匹配但不分组也不捕获,不捕获则不生成match对象。
  替换方法sub():
  上面已经学习了查找,这个是替换方法,有两种常用方式,我称为全部隐藏替换和部分隐藏替换:
  全部隐藏替换:
aa = re.compile(r'engineer (\w)\w+')  
bb = aa.sub(r'XX', 'engineer Ricky gave engineer Tom an apple')
  bb得到字符串'XX gave XX an apple'
  部分隐藏替换:
aa = re.compile(r'engineer (\w)\w+')  
cc = aa.sub(r'\1**', 'engineer Ricky gave engineer Tom an apple')
  cc得到字符串'R** gave T** an apple'
  常用的正则表达式举例:
  r'0\d{2,3}-\d{8}'      匹配固定电话,如:0755-87226688,010-85332765

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551476-1-1.html 上篇帖子: Python学习之对象基础 下篇帖子: python学习之多进程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表