try: '''可能会出现异常的代码'''except ValueError: ''''打印一些提示或者处理的内容'''except NameError: '''...'''except Exception: '''万能异常不能乱用'''
try: '''可能会出现异常的代码'''except ValueError: ''''打印一些提示或者处理的内容'''except NameError: '''...'''except Exception: '''万能异常不能乱用'''else: '''以上所有的except都不执行'''
try: '''可能会出现异常的代码'''except ValueError: '''打印一些提示或者处理的内容'''else: '''try中的代码正常执行了'''finally: '''无论错误是否发生,都会执行这段代码,用来做一些首尾工作'''
number = input('please input your phone number:')if number.isdigit() and number.startswith('13')\ or number.startswith('14')\ or number.startswith('15')\ or number.startswith('16')\ or number.startswith('17')\ or number.startswith('18')\ or number.startswith('19'): print('通过检查')else: print('格式错误')上面的代码太冗长了,使用正则number = input('please input your phone number:')ret = re.match('(13|14|15|16|17|18|19)[0-9]{9}',number)if ret:print('通过初检查')
实例一:
匹配出手机号码,就可以使用正则了。
with open('a',encoding='utf-8')as f1: li = [] for i in f1: i = i.strip() ret = re.findall('1[3-9]\d{9}',i) li.extend(ret) #extend 合并print(li)
正则表达式
在线测试工具
那么在之后我们更多要考虑的是在同一个位置上可以出现的字符的范围。 字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
匹配大写
大小写匹配
.是万能的,除了换行符以外
匹配空白
重点
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾
|
以海开头
正则表达式,不能写在后面
它只能出现在开始位置不能在中间或者后面位置
这种情况,是唯一ke可以放到任意位置的
表示匹配11位以上,不能低于11位
匹配15位,往多的匹配
匹配1次或者多次
重点:
量词只能约束一个字符串
这里的约束[A-Z]
同时约束[0-9]和[A-Z]
最多2次
带红线,不是重要的
元字符,应该和量词使用
需求对二个约束
写这样写不好
至少匹配15次
这样写,就比较专业
2个下划线就是转义
结果就是一项
?先匹配后面的。
几个常用的非贪婪匹配Pattern
匹配字符 | 说明 |
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
*?的用法
匹配所有数字
with open('a',encoding='utf-8')as f1: li = [] for i in f1: i = i.strip() ret = re.findall('1[3-9]\d{9}',i) li.extend(ret)print(li)
执行输出:
ret = re.search('a', 'eva egon yuan').group()print(ret) #结果 : 'a'# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
输出
a
为啥只有一个a呢?
# search 和 findall的区别: #1.search找到一个就返回,findall是我所有 #2.findall是直接返回一个结果的列表,search返回一个对象
#用search ,必须要if判断ret = re.match('a','eva egon yuan')print(ret)
什么结果是None ?
下面的方法,使用的比较少
split根据正则表达式切割
ret = re.split('[ab]','abcd')print(ret)#如果不写1,表示全部替换ret = re.sub('\d','H','eva3egon4yuan4') #将数字替换成‘H’,参数1表示只替换1个print(ret)
ret = re.subn('\d','H','eva3egon4yuan4') #将数字替换成‘H’,返回元祖(替换的结果,替换了多少次) print(ret)
表示替换了3次,返回一个元组
#正则表达式-->根据规则匹配字符串 #从一个字符串中找到符合规则的字符串 --> python #正则规则 -编译-> python能理解的语言 #多次执行,就需要多次编译 浪费时间 re.findall('1[3-9]\d{9}',line) 这样就快了,提前编译了
import reobj = re.compile('\d{3}')ret = obj.search('abc123eeee')obj.match('abc123eeee')obj.findall('23t3faabc123eeee')print(ret.group())
执行输出:
编译在多次执行同一个正则规则,有效
import reret = re.finditer('\d','ds2fa24t43fas') #finditer 返回一个存放匹配结果的迭代器print(ret)print(next(ret).group()) #查看一个结果print(exit().group()) #查看第二个结果print([i.group() for i in ret]) #查看剩余的左右结果
迭代器
结论
ret = re.split("\d+","eva3egon4yuan")print(ret)
2 将以数字分割的数字也留下来。
ret = re.split("(\d+)","eva3egon4yuan")print(ret)
split分割一个字符串,默认被匹配到的分隔符不会出现在结果列表中
如果将匹配的正则放到组内,就会将分隔符放到结果列表里。
综合练习与扩展
1.匹配标签
#分组命名 和 search 遇到分组
#标签 .html网页文件,标签文件
#<h1>aaaaaa</h1>
import reret = re.search("<\w+>\w+ ","hello
")print(ret.group())
这不是我想要的
import re ret = re.search("<\w+>\w+ ","hello
") print(ret.group())
#假如这里我想他以<h1>这个成对的标签来做匹配呢?显然上面的在这个示例是不行的。
ret = re.findall('\w+',"hello
")print(ret)
import re#分组的意义#hell0
ret = re.findall('<\w+>(\w+) ',"hello
")print(ret)
#分组的意义:
#1.对一组正则规则进行量词约束
#2.从一整条正规则匹配的结果中优先显示组内的内容
#分组命名