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

[经验分享] Python-正则表达式

[复制链接]

尚未签到

发表于 2018-8-13 11:56:16 | 显示全部楼层 |阅读模式
  一.正则表达式
  正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
  
  1.基本模式
  字面模式: 就是字面长量,就代表其本身
  . 匹配任何字符
  \w 匹配一个字母、数字、下划线
  \W 匹配非字母、数字、下划线
  \s 匹配空白
  \S 匹配非空白字符
  \d 匹配数字
  ^ 开头
  $ 结尾
  \ 转义字符
DSC0000.png

DSC0001.png

元字符:  [[:digit:]]
  [[:upper:]]
  通配符:^,$,[]  , ^和$在[]中不代表以什么开头以什么结尾的意思
  *
  ?
  $,^
  []
  2.次数的匹配 , 匹配其前面的字符出现的次数 :
  * 0 次或多次
  + 一次或多次
  ? 零次或一次
  {n}              代表重复n次
  {m,n}          代表重复m次到n次
  {0,}             重复0次到无穷大,*
  {1,}             重复1次到无穷大,+
  {0,1}           重复0次或一次,?
  3.中括号
  中括号用于指向一个字符集合
  中括号可以使用元字符
  中括号中的. 表示其字面意思
  [a-z] [A-Z] [0-9] [A-Za-z]
  [0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;
  [0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字符串;
  [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精确地限制了变量的长度是 120个字符;
  A|B 可以匹配 A 或 B
  ^\d 表示必须以数字开头
  \d$ 表示必须以数字结束
DSC0002.png

  练习: 检验变量名是否合法?
DSC0003.png

  
  思考
  判断一个字符串是否是合法的 Email 的方法;
  判断满足029-1234567这样要求的电话号码的方法;
  myre = r"^010-{0,1}\d{8}"    可以写成 myre = r"^010-?\d{8}"
  re.findall(myre,s)
  二.re 模块
  r = r'hello'
  re.match(r, 'hello')
  re.match(r, 'westos')
  match() 方法判断是否匹配,如果匹配成功,返回一个 Match对象,否则返回 None 。
  分组
  m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
  m.group(0)
  m.group(1)
  m.group(2)
DSC0004.png

  贪婪匹配
  正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
  >>> re.match(r'^(\d+)(0*)$', '102300').groups()
  ('102300', '')
  注:
  \d+ 采用贪婪匹配,直接把后面的 0 全部匹配了,结果 0* 只能匹配空字符串
  \d+ 采用贪婪匹配,直接把后面的 0 全部匹配了,结果 0* 只能匹配空字符串必须让 \d+ 采用非贪婪匹配(也就是尽可能少匹配),才能把后面的 0 匹配出来,加个 ? 就可以让 \d+ 采用非贪婪匹配
  三.编译
  当我们在 Python 中使用正则表达式时,re 模块内部会干两件事情:
  1. 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
  2. 用编译后的正则表达式去匹配字符串。
  重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式。
  编译
  r = r'hello'
  r_compile = r.compile(r)
  r_compile .match()
  myre = r"^010-?\d{8}"
  comR = myre.compile(myre)
  re.findall(comR,s)
  re.finditer(comR,s)
  练习
  基础版:有一个日志文件access.log,统计访问前十的 IP 地址和访问次数。
  升级版:有多个日志文件access.log,统计访问前十的 IP 地址和访问次数。
  四.总结
  re.match(p,text) :p 为正则表达式模式, text 要查找的字符串,会返回一个match 对象
  re.search(p,text) : 只要在 text 中匹配到了 p 就返回,只返回第一个匹配到的
  re.findall(p,text) :将能匹配上的全返回,会返回一个 list
  re.split(p,text) : 按照 p 匹配,并且以匹配到的字符为分隔符切割 text, 返回一个切割后的 list(s.split() )
  re.sub(p,s,text) : 替换,将 p 匹配到的字符替换为 s.    (相当于s.replace())
  pattern = re.compile(p) 先编译 p 模式,当正则表达式模式比较复杂的时候,会先编译,然后再使用

运维网声明 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-551155-1-1.html 上篇帖子: python注册登录的实现--low版 下篇帖子: Python3.5修炼手册12-duyuheng
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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