# 异常处理
# try except 一定要在except之后写一些提示或者处理的内容
# try:
# '''可能会出现异常的代码'''
# except ValueError:
# '''打印一些提示或者处理的内容'''
# except NameError:
# '''...'''
# # except Exception as e:
# # '''打印e'''
# else:
# '''try中的代码正常执行了'''
# finally:
# '''无论错误是否发生,都会执行这段代码,用来做一些收尾工作'''
-------------*****-------------
1.正则表达式
# regex
# 正则表达式
# re模块 可以读懂 你写的正则表达式
# 根据你写的表达式去执行任务
# 正则表达式是做什么的?
# 正则表达式 字符串的操作
# 使用一些规则来检测字符串是否符合我的要求 —— 表单验证
# 从一段字符串中找到符合我要求的内容 —— 爬虫
# 完全相等的字符串都可以匹配上 ==
# 字符组 字符组代表一个字符位置上可以出现的所有内容
# 范围 :
# 根据asc码来的,范围必须是从小到大的指向
# 一个字符组中可以有多个范围
#身份证验证
#普通做法
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('格式错误') #正则做法 import re number = input('please input your phone number : ') ret = re.match('(13|14|15|17|18|19)[0-9]{9}',number) if ret:print('通过初检查')
例子:
# 身份证号码是一个长度为15或18个字符的字符串,首位不能为0
# 如果是15位则全部由数字组成;
# 如果是18位,则前17位全部是数字,末位可能是数字或x,
# 下面我们尝试用正则来表示:
# 15 位 a = '[1-9]\d{14}' # 18 位 b = '[1-9]\d{16}[\dx]' # [1-9]\d{13,16}[\dx] # [1-9]\d{16}[\dx]|[1-9]\d{14} # a|b [ab] #[1-9]\d{16}[\dx]|[1-9]\d{14} 或 # 如果两个正则表达式之间用"或"连接,且有一部分正则规则相同, # 那么一定要把规则长的放在前面 # [1-9]\d{13,16}[\dx] # [1-9]\d{14}(\d{2}[\dx]){0,1} # [1-9]\d{14}(\d{2}[\dx])? 分组 # 如果对一组正则表达式整体有一个量词约束,就将这一组表达式分成一个组 # 在组外进行量词约束 # r'\\n',r'\n' # 贪婪匹配
2.re模块
# findall接收两个参数 : 正则表达式 要匹配的字符串
# 一个列表数据类型的返回值:所有和这条正则匹配的结果
import re
ret = re.findall('a', 'eva egon yuan')
print(ret)
ret = re.findall('\d+', 'dsaglhlkdfh1892494kashdgkjh127839')
print(ret)
例子:# 从a文件中找出所有的手机号码 —— 正则
# search和findall的区别:
1.search找到一个就返回,findall是找所有
2.findall是直接返回一个结果的列表,search返回一个对象
# 如果匹配到了,返回一个结果对象
# 如果没匹配到,返回一个None
import re
with open('a',encoding='utf-8') as f:
l = []
for line in f:
ret = re.findall('1[3-9]\d{9}',line)
l.extend(ret)
print(l)
#search
import re
ret = re.search('b', 'eva egon yuan')
if ret:
print(ret.group()) # 从结果对象中获取结果
# match
# ·1 意味着在正则表达式中添加了一个^
# ·2 和search一样 匹配返回结果对象 没匹配到返回None
# ·3 和search一样 从结果中获取值 仍然用group
import re
ret = re.match('a', 'eva egon yuan')
if ret:
print(ret.group())
#subn
import re
ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)
# 正则表达式 -->根据规则匹配字符串
# 从一个字符串中找到符合规则的字符串 --> python
# 正则规则 -编译-> python能理解的语言
# 多次执行,就需要多次编译 浪费时间 re.findall('1[3-9]\d{9}',line)
# 编译 re.compile('\d{3}')
import re
obj = re.compile('\d{3}') # 编译 在多次执行同一条正则规则的时候才适用
ret1 = obj.search('abc123eeee')
ret2 = obj.findall('abc123eeee')
print(ret1.group())
print(ret2)
import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer适用于结果比较多的情况下,能够有效的节省内存
print(ret) # <callable_iterator object at 0x10195f940>
print(ret.__next__().group())
for i in ret:
print(i.group())
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print([i.group() for i in ret]) #查看剩余的左右结果
# 当分组遇到re模块
import re
ret1 = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.baidu.com')
print(ret1)
print(ret2)
findall会优先显示组内匹配到的内容,如果想取消分组优先效果,在组内开始的时候加上 ?:
import re
ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva162784673egon44yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
# split分割一个字符串,默认被匹配到的分隔符不会出现在结果列表中,
# 如果将匹配的正则放到组内,就会将分隔符放到结果列表里
分组命名 和 search遇到分组
# 标签 .html 网页文件 标签文件
import re
#分组的意义
# 1.对一组正则规则进行量词约束
# 2.从一整条正则规则匹配的结果中优先显示组内的内容
"<h1>hello</h1>"
ret = re.findall('<\w+>(\w+)</\w+>',"<h1>hello</h1>")
print(ret)
# 分组命名
ret = re.search("<(?P<tag>\w+)>(?P<content>\w+)</(?P=tag)>","<h1>hello</h1>")
print(ret)
print(ret.group()) # search中没有分组优先的概念
print(ret.group('tag'))
print(ret.group('content'))
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
ret = re.search(r"<(\w+)>(\w+)</\1>","<h1>hello</h1>")
print(ret.group())
print(ret.group(0)) #结果 :<h1>hello</h1>
print(ret.group(1)) #结果 :h1
print(ret.group(2)) #结果 :hello