正则基础知识
内容概要
-
正则表达式前戏
-
正则表达式基本使用
-
正则表达式特殊符号
-
正则表达式量词
-
正则表达式贪婪与非贪婪匹配
-
正则表达式取消转义
-
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.startwith('13') or phone_num.startwith('15') or phone_num.startwith('17') or phone_num.startwith('18') or phone_num.startwith('19'):
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|19)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是正常的手机号码')
# 使用正则表达式
"""正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需要的数据
任何编程语言都可以使用 在python中如果想用就必须借助于模块re"""
大白话:正则表达式就是利用一些'特殊符号'的组合去字符串中筛选出我们想要的数据
所以正则表达式的学习在很大程度上就是在学习一些特殊符号的使用
补充
在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据
![]()
二、正则表达式之字符组
在线测试网站:http://tool.chinaz.com/regex/
我们是可以通过在线测试网站来学习正则表达式的特殊符号
"""单个字符默认一次只能匹配一个字符(一个个匹配字符)"""
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字(简写)
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母(数字与字母之间是或的关系 没有顺序之分)
三、正则表达式之特殊符号
"""前期就是死记硬背 使用多了之后就会自然记得住了"""
# 特殊符号默认也是一次匹配一个字符(一个一个去匹配)
. 表示的是匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线(后续筛选变量名可能用到)
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
比如:^9 找9并且这个9必须在开头
$ 匹配字符串的结尾
比如:9$ 找9并且这个9必须在末尾
\w 匹配非字母或非数字或非下划线 注意这里的是'w'小写的 上面的是大写W
\D 匹配非数字
a|b 匹配a或者b 管道符 就是或的意思
() 给正则表达式分组不影响正则匹配(后续再讲) 分组表达 不影响正则的意思
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上键号出现了中括号的里面意思是取相反意思的操作
四、正则表达式之量词
"""量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数"""
# 注意量词默认的都是贪婪匹配(尽可能多的匹配):后面详细的讲解
* 重复零次或多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越来越好) 就是一次性拿出来
? 重复零次或者一次(默认一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次(越多越好)
{n,m} 重复n到m次(越多越好)
五、课堂练习
# 表达式
海. 海燕海娇海东
^海. 海燕
海.$ 海东
李.? 李杰 李莲英 李二棍子 三条
李.* 李杰和李莲英和李二棍子 一条
李.+ 李杰和李莲英和李二棍子 一条
李.{1,2} 李杰和李莲英和李二棍子 三条
李[杰莲英二棍子]* 李杰和李莲英和李二棍子 三条
李[^和]* 李杰 李莲英 李二棍子 三条
\d+ 456 3 两条
六、复杂正则的编写
# 校验用户身份证号码
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0,如果是18位,则前17位全部是数字,末位可是数字或X
^[1-9][0-9]{14}
^[1-9][0-9]{16}[0-9x]
# 校验邮箱、快递单号、座机号>>>
'很多常见的正则校验符号 不需要我们编写 直接百度查找即可'
注意:百度的前提是自己能够看懂别人写的大致意思
^[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 \n false
\\n \n True
\\\\n \\n True
在python中还可以在字符串的前面加r取消转义 更加方便
八、贪婪匹配与非贪婪匹配
# 正则 # 待匹配的文本
# 结果
<.*> <script>alert(123)<script> 1条 贪婪匹配
是以最后一个大括号的出现作为结束标志
<.*?> <script>alert(123)<script> 2条 非贪婪匹配
是以第一个大括号的出现作为结束的标志
量词默认为都是贪婪匹配 如果想修高为非贪婪匹配 只需要在量词的后面加?即可
"贪婪与非贪婪通常都是利用左右两边的条件作为筛选依据
九、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([i.group() for i in res3] ) # ['a', 'a', 'a', 'a', 'a']
res4 =re.compile('\d+') # 我们可以先写好 后期需要经常使用的正则
print(re.findall(res4,'fasasdfvdfd123')) # 写一遍后 直接反复调用即可
print(re.findall(res4,'fsfddadsfda2345')) # 写一遍后 直接反复调用即可
print(re.findall(res4,'xdgsbgdf123')) # 写一遍后 直接反复调用即可



浙公网安备 33010602011771号