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

[经验分享] python笔记-正则表达式

[复制链接]

尚未签到

发表于 2018-8-13 08:42:48 | 显示全部楼层 |阅读模式
  正则表达式

  •   匹配
  \d 匹配一个数字
  \w 匹配一个字母或一个数字
  \s 匹配一个空格或tab空白符
  \b 匹配字符边界
  以上特殊字符变成大写,表示与之相反。
  \N 匹配已保存的子组
  ^或\A 匹配字符串的开始
  $或\Z 匹配字符串的结束
  .  匹配任意一个字符

  •   个数
  + 表示其前面的字符串至少出现了一次
  ? 表示其前面的字符出现了一次或零次
  * 表示其前面的字符出现了任意次,可能是零次、一次或多次
  {n} 表示其前面的字符串出现了n次
  {n,m} 可以表示其前面的字符串出现了n-m次
  [] 匹配一个范围,例如[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线,[]中以^开头表示"非"

  •   转义
  \ 表示转义
  r'' 引号中的特殊字符会被转义(建议使用这种,不用考虑转义问题)

  •   re模块
  match()方法    判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串'  
re.match(r'正则表达式',str,flags)
  例如:
import re  
find1 = re.match(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','127.0.0.1')
  
print("find1:%s,%s"%(find1,find1.group()))
  
#打印内容
  
find1:<_sre.SRE_Match object; span=(0, 9), match='127.0.0.1'>,127.0.0.1
  
  search()方法     在指定的字符串中,查找第一个能够匹配成功的字符串,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串'  
re.search(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find2 = re.search(r'\d{11}',str)
  
print(&quot;find2:%s,%s&quot;%(find2,find2.group()))
  
#打印内容
  
find2:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000
  
  findall()方法    在指定的字符串中,查找所有匹配成功的字符串,如果匹配成功,返回一个列表,包含所有匹配成功的字符串,否则返回空列表。常见语法如下:
str = '用户输入的字符串'  
re.findall(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find3 = re.findall('\d{11}',str)
  
print(&quot;find3:%s&quot;%find3)
  
#打印内容
  
find3:['15810740000','12346010473']
  
  finditer()方法    与findall类似,只不过返回的是个callable_iterator迭代器,python2中支持next方法去遍历,python3中不支持。常见语法如下:
str = '用户输入的字符串'  
re.finditer(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find4 = re.finditer('\d{11}',str)
  
for i in find4:
  
    print(&quot;find4:%s,%s&quot;%(i,i.group()))
  
#打印内容
  
find4:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000
  
find4:<_sre.SRE_Match object; span=(46, 57), match='12346010473'>,12346010473
  sub()、subn()方法    搜索和替换,sub返回替换后的字符串,subn返回一个元组,元素分别是替换后的字符串和替换的个数。如果没有正确的匹配替换,将返回原字符串,常见语法如下:
str = '用户输入的字符串'  
re.sub(r'正则表达式',repl,str,count=0)
  
re.subn(r'正则表达式',repl,str,count=0)
  
#使用repl替换正则表达式在str中匹配的部分,如果指定count个数,将替换对应的个数,否则将全部替换
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
sub1 = re.sub('(\d{11})',r'+86 \1',str)
  
print(&quot;sub1:%s&quot;%(sub1))
  
sub2 = re.subn('(\d{11})',r'+86 \1',str)
  
print(&quot;sub2:%s,共替换%s处&quot;%(sub2))
  
#打印内容
  
sub1:my phone is +86 15810740000 ,my friend's phone is +86 12346010473
  
sub2:my phone is +86 15810740000 ,my friend's phone is +86 12346010473,共替换2处
  注:在sub1、sub2正则表达式中都用了一个'\1',表示的就是匹配的字符串。
  '(\d{11})'用了小括号,表示分组,'\1'表示分组的编号,这里只有一对小括号(一组),'\1'对应的就是全部匹配字符串。
  split()方法    与字符串分割的方法类似,但是功能更加强大,常见语法如下:
str = '用户输入的字符串'  
re.split('正则表达式',str,maxsplit=0)
  
#指定maxsplit个数只分割对应的个数,不指定将全部分割。python2中该参数为max
  例如:
str = 'root:x:0:0:root:/root:/bin/bash'  
print(re.split(':',str,maxsplit=5))
  
#打印内容
  
['root', 'x', '0', '0', 'root', '/root:/bin/bash']
  补充:
  匹配对象的方法group(num=0)和groups()    group()返回匹配对象整个匹配的结果,对于含有子组的匹配对象来说,指定num,将返回对应的子组;groups()返回一个元组,包含匹配的每个子组,如果没有成功匹配,返回一个空元组,例如:
import re  
str = '158107470000@163.com'
  
reg = r'(\w+)@(\w+).com'
  
find1 = re.match(reg,str)
  
print(find1.group(),find1.group(1),find1.group(2))
  
print(find1.groups())
  
#打印内容
  
158107470000@163.com 158107470000 163
  
('158107470000', '163')
  常用属性    re模块还包括一些常用的属性,可以在匹配时作为flags使用,如下:
#re.I、re.IGNORECASE    不区分大小写的匹配  
#re.L、re.LOCALE        根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S 实现匹配
  
#re.M、re.MULTILINE    ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾
  
#re.S、rer.DOTALL        “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示“.”(点号)能够匹配全部字符
  
#re.X、re.VERBOSE        通过反斜线转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且提高可读性

  •   分组
  () 小括号中匹配的分为一组,常用功能:简洁代码、字串提取,例如:
#匹配ip地址,相同的部分写成了一组  
import re
  
re.match(r'(\d{1,3}.){3}\d{1,3}','127.0.0.1')
#识别时间,提取小时、分钟、秒  
import re
  
t = '23:05:30'
  
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
  
print (m.groups())

运维网声明 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-550936-1-1.html 上篇帖子: Python解决读取文件出现空行的问题 下篇帖子: Python重启深信服设备
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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