1. 正则表达式
# 很多注册页面都是需要填写手机号的,那么手机号必须是11位的纯数字,并且必须是常规的手机号开头(13, 15, 17, 18, 19)
'''正则表达式实现手机校验功能'''
import re
phone_number = input('输入手机号码: ').strip()
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需的数据
任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
"""
# 正则表达式其实就是利用一些'特殊符号'的组合,从字符串中筛选出想要的数据
2. 正则表达式之字符组
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字,就是上面匹配表达式的缩写
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母,里面的0-9,a-z,A-Z顺序都是可以随机分配的,想怎么写就怎么写
3. 正则表达式之特殊符号
# 特殊符号默认也是一次匹配一个字符
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线(后续筛选变量名可能用到)
\d 匹配任意的数字
\t 匹配一个制表符就是匹配一个tab键
^ 匹配字符串的开始的字符 例: ^9 找9并且这个9必须在开头
$ 匹配字符串的结尾 例: 9$ 找9并且这个9必须在结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
a|b 匹配a或者b 管道符就是or(或)的意思
() 给正则表达式分组 不影响正则匹配(后续再讲)
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作
4. 正则表达式之量词
"""量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数"""
# 注意量词默认都是贪婪匹配(尽可能多的匹配):后面详细的讲解
re* 重复零次或者多次(默认就是多次:越多越好)
re+ 重复一次或者多次(默认就是多次:越多越好)
re? 重复零次或者一次(默认就是一次:越多越好)
re{n} 重复n次
re{n,} 重复最少n次最多多次(越多越好)
re{n,m} 重复n到m次(越多越好)
5. 取消转义
\n \n False
\\n \n True
\\\\n \\n True
在python中还可以在字符串的前面加r取消转义 更加方便
如果想要使用\n,并且不是换行符,那么可以r'\n',这样其中的\n就不是换行符的意思了
6. 贪婪匹配与非贪婪匹配
# 正则 # 待匹配的文本 # 结果
<.*> <script>alert(123)<script> 1条 贪婪匹配
以最后一个大括号的出现作为结束标志
<.*?> <script>alert(123)<script> 2条 非贪婪匹配
以第一个大括号的出现作为结束标志
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
7. re模块
# 在python中无法直接使用正则 需要借助于模块
# 1.内置的re模块
# 2.第三方的其他模块
import re
# 1. findall(正则表达式,待匹配的文本)
# 结果是所有符合条件的数据 并且组织成了列表
res = re.findall('a', 'jason oscar aaa')
print(res)
# >>>['a', 'a', 'a', 'a', 'a']
# 2. search(正则表达式,待匹配的文本)
# 查找到一个符合条件的数据就结束 没有则返回None
res1 = re.search('a', 'jason oscar aaa')
print(res1)
# >>><re.Match object; span=(1, 2), match='a'>
# 没有则无法调用group() 直接报错
print(res1.group())
# >>>a
# 3. match(正则表达式,待匹配的文本)
# 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
res2 = re.match('j', 'jason oscar aaa')
print(res2)
# >>><re.Match object; span=(0, 1), match='j'>
print(res2.group())
# >>>j
# 4. finditer(正则表达式,待匹配的文本)
# 在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
res3 = re.finditer('a', 'jason oscar aaa')
print(res3)
# >>><callable_iterator object at 0x000002251F58A0A0>
print([obj.group() for obj in res3])
# >>>['a', 'a', 'a', 'a', 'a']
# 5. compile(正则表达式)
# 生成一个正则表达式( Pattern )对象。
obj = re.compile('\d+')
print(re.findall(obj, '123232421412a')) # 写一遍之后 直接反复调用即可
print(re.findall(obj, 'python 123 cat'))
print(re.findall(obj, 'cat 123124 python'))