Day29笔记

# 异常处理
# 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

猜你喜欢

转载自www.cnblogs.com/futing/p/8980204.html