引入方式
 import re 


方法

  .findall()   
        找所有的,返回所有的结果然后放在列表中 
 ret = re.findall("[a-z]+","yangtuo tiancan shiye ")
print(ret) # ['yangtuo', 'tiancan', 'shiye']
  .finditer()  
        返回一个迭代器 ,更节省内存,一次一次返回
 ret = re.finditer("\d","dahka5hdka4546465h")
print(ret)    # <callable_iterator object at 0x0000000002061EF0>
print(next(ret).group()) #
print(next(ret).group()) #
print([i.group() for i in ret]) # ['5', '4', '6', '4', '6', '5']
  .search()  
        从前往后找到一个就返回一个对象,调用group才可以拿到结果
 ret = re.search("a","yangtuo is tiancai")
print(ret.group()) # a
        找不到返回None,无法调用group,会报错
 ret = re.search("[0-9]+","yangtuo is tiancai")
print(ret) # None
print(ret.group()) # AttributeError: 'NoneType' object has no attribute 'group'
        为了避免上面的这种报错,可以利用if判断,从而打断if循环不报错,非常常用的方式
 ret = re.search("j","yangtuo is tiancai")
if ret:
print(ret.group())  # 无结果但是不会报错了
  
  .match()  
      必须从头开始匹配,比如下面的字符串,y,ya都能匹配上。但是a就不行
      用法和search一样,返回对象,必须用group输出,空报错,可if避免
 ret = re.match("[a-z]+","yangtuo is tiancai")
print(ret.group()) # yangtuo
ret = re.match("a","yangtuo is tiancai")
print(ret.group()) # AttributeError: 'NoneType' object has no attribute 'group'
   
  .split()
      按照正则关系分割,不是很常用
 ret = re.split("[ab]","abcd")
# 先按a分割得到 " " 和"bcd",再按b分割得到 " "," ","cd"
print(ret) # ['', '', 'cd']
    
  .sub()
      按照正则对字符串替换
      将数字替换成H 替换两次
 ret = re.sub("\d","H","shah4546shdah123",2)
print(ret) # shahHH46shdah123
    
  .subn()
      按照正则对字符串替换,并且返回结果和替换了几次用元祖形式
      将数字替换成H 替换两次
 ret = re.subn("\d","H","shah4546shdah123",2)
print(ret) # ('shahHH46shdah123', 2)
    
  .compile()
        同一个正则规则需要被用很多次的时候可以使用此命令重复调用
        将正则表达式编译成一个对象,调用对象使用更简单
 obj = re.compile("\d{3}")
ret = obj.search("hsdhabsh153lhslk86")
ret1 = obj.search("hsdh46897=lhslk86")
print(ret.group()) #
print(ret1.group()) #


特殊场景分析

  

findall的优先级查询
 import re    
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy']
# 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配真实想要的结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
  

split的优先级查询
    在匹配部分加上()之后所切出的结果是不同的,
    没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    这个在某些需要保留匹配部分的使用过程是非常重要的。
 ret=re.split("\d+","eva3egon4yuan")
print(ret) # ['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) # ['eva', '3', 'egon', '4', 'yuan']  
 

分组的命名和引用
    组名的方式命名(?P<组名>)
    组名的引用(?P=组名)
 ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
print(ret.group("tag_name"))   # h1
print(ret.group()) # <h1>hello</h1>
    也可以直接分组,然后用\1引用第一个组,组的索引是从1开始不是从0开始
 ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
print(ret.group(1)) # h1
print(ret.group()) # <h1>hello</h1>
匹配小数整数
 # 40.35被当做40和35两个来取了
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
  利用|的工作原理从左到右最长匹配,将长的匹配项先写就可以
  注意将 . 进行转义 \.
  可以分组将分组的内容优先显示,但是无匹配的选项会用空表示出来,很蛋疼
  可以使用remove进行空选项的移除 顺便这次稍微升级一下吧负号一起取到了
 ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

示例:
  
  获取手机号匹配方式对比   
  普通的方式实现
 while True:
phone_number = input('please input your phone number : ')
if len(phone_number) == 11 \
and phone_number.isdigit()\
and (phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('')):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
  re 实现
 # 正则实例
import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

												

day21 re模块的更多相关文章

  1. day21:正则函数&模块和包(import)

    正则函数 1.search  通过正则匹配出第一个对象返回,通过group取出对象中的值 # search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1 ...

  2. day21、模块

    模块: 模块,用一砣代码实现了某个功能的代码集合.不同功能,放置在不同模块中,模块就是一个.py文件.避免函数重复写代码.对于相同功能的代码.只需要调用该模块或者该模块里面的函数就可以.增加灵活性,和 ...

  3. day21 xml模块 ATM+购物车

    1. xml模块 <father name="jack"> # 属性的值必须加双引号 <son> 标签的关闭顺序,与开启顺序相反, 最先开启的最后关闭,最后 ...

  4. 常用模块(random,os,json,pickle,shelve)

    常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...

  5. Python全栈day21(调用模块路径BASEDIR的正确方法)

    正常写python程序会有一个可执行的bin.py文件,假如这个文件需要导入my_module里面定义的模块,应该怎么设置sys.path 文件夹目录结构如下,因为bin不在与my_module同级目 ...

  6. day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版

    day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...

  7. day21.模块和包

    博客整理来源:http://www.cnblogs.com/Eva-J/articles/7292109.html 模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件 ...

  8. day21 python之模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  9. day21 模块 异常处理

    常用模块:http://www.cnblogs.com/Eva-J/articles/7228075.html 今日概要: #time # —— 时间:时间戳 字符串 结构化时间 #collectio ...

随机推荐

  1. Google 是如何收集我们的个人数据的

    简评:还有其他公司比 Facebook 更能收集我们的数据么?大概,可能,没准是谷歌.(文末彩蛋) 最近 Facebook 已经因为收集个人数据而站在了聚光灯前,它收集用户数据并因此获利. 但是要知道 ...

  2. GBDT和随机森林的区别

    GBDT和随机森林的相同点: 1.都是由多棵树组成 2.最终的结果都是由多棵树一起决定 GBDT和随机森林的不同点: 1.组成随机森林的树可以是分类树,也可以是回归树:而GBDT只由回归树组成 2.组 ...

  3. SSL踩坑ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    最近公司项目开发了一个微信小程序,并且部署测试OK,由于微信小程序调用的后端接口必须是HTTPS,所以给接口安装了SSL,第一天测试都正常.第二天早上再使用时页面无响应. 抓包发现是后端接口抛出: n ...

  4. Linq 之 Select 和 where 的用法

    最近开始学习linq.自己也总结一下,方便以后查阅. Select 同 Sql 中的 select 类似,即输出我们要的东东,感觉在 linq 中更加强大. Linq 可以对集合如数组.泛型等操作,这 ...

  5. Nginx 403 Forbidden 解决方案 史上最靠谱

    原因 1. SELinux为开启状态(enabled) 查看SELinux的状态 sestatus 如果不是 disables , 需要 vi /etc/selinux/config 将以前的 SEL ...

  6. Nginx入门【转】

    原文地址:http://blog.csdn.net/u012486840/article/details/53098890 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上 ...

  7. SQL多表查询总结

    前言 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要.只有真正了解它们之间的区别,才能正确使用. 一.Union UNION 操作符用于合并两个或多个 SELE ...

  8. nginx try_files 详解

    server { listen ; server_name localhost; index index.html index.htm index.php; root /data/wwwroot; l ...

  9. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  10. 饿了么element UI<el-dialog>弹出层</el-dialog>修改默认样式不能在<style scoped>修改

    如果在非scoped下,修改el-dialog自动添加的DIV类名的style加上important,可以覆盖原来的width,但这样会让整个项目的样式都乱套. 如果在scoped下修改style.所 ...