今日内容概要
- 正则表达式前戏
- 正则表达式之字符组
- 正则表达式之特殊符号
- 正则表达式之量词
- 课堂练习
- 复杂正则的编写
- 取消转义
- 贪婪匹配与非贪婪匹配
- re模块
今日内容详细
一、正则表示式前戏
- 正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需的数据
- 任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
- 在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据
- 用自己的话概括:什么是正则表达式?
利用一些’特殊符号’的组合去字符串中筛选出想要的数据(所以学习正则很大程度上就是在学习一些特殊符号的使用)
# 京东注册页面获取手机号
有很多校验规则
必须是11位的纯数字 并且必须是常规的手机号开头(13,15,17,18,19)
# 上述的规则能否使用python代码实现
'''python实现手机校验功能'''
# 1.获取用户的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.先校验是否是11位
if len(phone_num) == 11:
# 3.再校验是否是纯数字
if phone_num.isdigit():
# 4.校验开头是否合法(随便写几个意思一下)
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18'):
print('是一个正常的手机号')
else:
print('手机号开头不合法')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')
# 使用正则表达式
'''正则表达式实现手机校验功能'''
import re
phone_number = input('please input your phone number : ').strip()
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
二、 正则表达式之字符组
在线测试网站:http://tool.chinaz.com/regex/
'''单个字符组默认一次只匹配一个字符'''
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字(简写)
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母(没有顺序)
三、正则表达式之特殊符号
- 特殊符号默认也是一次匹配一个字符
四、正则表达式之量词
- 量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数
- 注意量词默认都是贪婪匹配(尽可能多的匹配)
五、课堂练习
1、.^$
2、* + ? { }
六、复杂正则的编写
- 很多常见的正则校验符号 不需要我们编写 直接百度查找即可
# 校验用户身份证号码
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
^[1-9][0-9]{14}
^[1-9][0-9]{16}[0-9x]
# 校验邮箱、快递单号、座机号...
"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""
ps:百度的前提是自己能够看懂别人写的大致意思
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
七、取消转义
-
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对""进行转义,变成’\’
-
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\n",字符串中要写成’\n’,那么正则里就要写成"\\n",这样就太麻烦了。这个时候我们就用到了r’\n’这个概念,此时的正则是r’\n’就可以了
八、 贪婪匹配与非贪婪匹配
- 贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
- 量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可
- 贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
九、re模块
# 在python中无法直接使用正则 需要借助于模块
1.内置的re模块
2.第三方的其他模块
import re
res = re.findall('a', 'jason oscar aaa') # findall(正则表达式,待匹配的文本)
print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表
res1 = re.search('a', 'jason oscar aaa') # search(正则表达式,待匹配的文本)
print(res1) # 查找到一个符合条件的数据就结束 没有则返回None
print(res1.group()) # a 没有则无法调用group() 直接报错
res2 = re.match('j', 'jason oscar aaa') # match(正则表达式,待匹配的文本)
print(res2) # None 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group()) # j 没有则无法调用group() 直接报错
res3 = re.finditer('a', 'jason oscar aaa') # finditer(正则表达式,待匹配的文本)
print(res3) # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a']
obj = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可