今日内容总结

  • 正则表达式前戏

  • 正则表达式基本使用

  • 正则表达式特殊符号

  • 正则表达式量词

  • 正则表达式贪婪与非贪婪匹配

  • 正则表达式取消转义

  • python内置模块之re模块

 

正则表达式前戏

正则表达式是一门独立的语言 专门用来匹配、校筛查所需的数据 任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
通俗的概括就是利用'特殊符号'的组合去字符串中筛选出想要的数据
所有学习正则很大程度上就是学习一些特殊符号的使用

注册页面获取手机号
有很多校验规则
必须是11位的纯数字 并且必须是常规的手机号开头(13,15,17,18,19)
上述的规则用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') or phone_num.startswith('15'):
print('手机号符合条件')
else:
print('手机号开头不合法')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')

使用正则表达式
import re
phone_number = input('请输入你的电话号码:').strip()
if re.match('^(13|14|15|18|19)[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] 匹配任意一个数字或者大小写字母(没有顺序)

正则表达式之特殊符号

特殊符号默认也是一次匹配一个字符
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线(后续筛选变量名可能用到)
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
a|b 匹配a或者b 管道符就是or的意思
() 给正则表达式分组 不影响正则匹配
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作

 

正则表达式之量词

'''量词必须跟再表达式的后边 不能单独使用 目的是增加匹配的字符数'''
# 注意量词默认都是贪婪匹配(尽可能多的匹配)
* 重复零次或者多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越多越好)
? 重复零次或一次(默认就是一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次(越多越好)
{n,m} 重复n到m次(越多越好)

复杂正则的编写

校验用户身份证号码
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
   ^[1-9][0-9]{14}
   ^[1-9][0-9]{16}[0-9x]
   
   
很多常见的正则校验符号 不需要我们编写 直接百度查找即可 前提是自己能够看懂别人写的大致意思

取消转义

\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('k','aeaw kakk saw')  # findall(正则表达式,待匹配的文本)
print(res)  # ['k','k','k'] # 结果是所有符合条件的数据 并且组成了列表

res1 = re.search('k','akeaw kakk saw')  # search(正则表达式,待匹配的文本)
print(res1)  # 查找到一个符合条件的数据就结束 没有就返回None
print(res1.group())  # k 没有则无法调用group() 直接报错

res2 = re.match('a','akeaw kakk saw')  # macth(正则表达式,待匹配的文本)
print(res2)  # 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了个^ 如果符合也只获取一个就结束
print(res2.group())  # a   没有则无法调用group() 直接报错

res3 = re.finditer('k','akeaw kakk saw')  # finditer(正则表达式,待匹配的文本)
print(res3)  # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3])  # ['k', 'k', 'k', 'k']

我们可以提前写好后续需要经常用的正则 之后直接反复调用即可


 

 posted on 2022-03-28 21:31  鳗鱼的春天  阅读(21)  评论(0编辑  收藏  举报