day21 re模块
引入方式
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模块的更多相关文章
- day21:正则函数&模块和包(import)
		正则函数 1.search 通过正则匹配出第一个对象返回,通过group取出对象中的值 # search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1 ... 
- day21、模块
		模块: 模块,用一砣代码实现了某个功能的代码集合.不同功能,放置在不同模块中,模块就是一个.py文件.避免函数重复写代码.对于相同功能的代码.只需要调用该模块或者该模块里面的函数就可以.增加灵活性,和 ... 
- day21 xml模块 ATM+购物车
		1. xml模块 <father name="jack"> # 属性的值必须加双引号 <son> 标签的关闭顺序,与开启顺序相反, 最先开启的最后关闭,最后 ... 
- 常用模块(random,os,json,pickle,shelve)
		常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ... 
- Python全栈day21(调用模块路径BASEDIR的正确方法)
		正常写python程序会有一个可执行的bin.py文件,假如这个文件需要导入my_module里面定义的模块,应该怎么设置sys.path 文件夹目录结构如下,因为bin不在与my_module同级目 ... 
- day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版
		day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ... 
- day21.模块和包
		博客整理来源:http://www.cnblogs.com/Eva-J/articles/7292109.html 模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件 ... 
- day21 python之模块和包
		一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ... 
- day21 模块   异常处理
		常用模块:http://www.cnblogs.com/Eva-J/articles/7228075.html 今日概要: #time # —— 时间:时间戳 字符串 结构化时间 #collectio ... 
随机推荐
- .net core 中使用httpclient,HttpClientFactory的问题
			Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ... 
- 换了电脑如何使用hexo继续写博客
			前言 我们知道,使用 Github+hexo 搭建一个个人博客确实需要花不少时间的,我们搭好博客后使用的挺好,但是如果我们有一天电脑突然坏了,或者换了系统,那么我们怎么使用 hexo 再发布文章到个人 ... 
- WinForm 简易仿360界面控件
			因为经常要做一些1.2千行的小工具,WinForm自带的TabCtrl又不美观,所以想做成360的样子,在网上找来找去,都只有散乱的代码,没有可以通用的结构,于是自己写了一个简易的通用控件. 控件主要 ... 
- 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记
			公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ... 
- #个人博客作业Week3——必应词典案例分析
			第一部分 调研以及评测 一.BUG分析 1. 翻译部分原文语言检测部分 1) 症状: 当选择原文语言是简体中文时,输入英文查询,程序不报错,继续翻译,选择其他类型语言也是如此. 且如果出现这种情况 ... 
- 剑值offer:最小的k个数
			这是在面试常遇到的topk问题. 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路: 思路一:用快排对数 ... 
- ADC转换的分辨率
			分辨率是指ADC能够分辨量化的最小信号的能力.分辨率用二进制位数表示.例如对一个10位的ADC,其所能分辨的最小量化电平为参考电平(满量程)的2的10次方分之一.也就是说分辨率越高,就能把满量程里的电 ... 
- 【转】单片机HEX文件完全解读
			转:http://www.eefocus.com/craftor/blog/10-07/193051_8ce59.html Craftor原创,首发于与非网,转载请保留此处. HEX文件,是Intel ... 
- Ajax的注意事项
			case 1: 无论是使用原生的JavaScript,还是JQuery,通过Ajax请求后端程序数据,返回的数据默认是字符串,字符串,字符串,重要的事情说三遍!!! case 2: 不要尝试直接将返回 ... 
- 解决AJAX应用,会话超时(Session Timeout)的问题,粗略方法(不考虑使用Filter的前提下)
			function ajaxPost(url, data) { var async = false; var result = {}; $.ajax({ url : url, async : async ... 
