Day19课后有感

正则表达式

  什么是正则表达式?

正则表达式是独立的一门语言,利用一些‘特殊符号’的组合来筛选、匹配、校验所需的数据,在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 匹配数字、字母、下划线(后续筛选变量名可能用到)
\W							匹配非字母或数字或下划线
\d 匹配任意的数字
\D							匹配非数字

\t 匹配一个制表符(tab键)
^ 匹配字符串的开始 eg:^9 找9并且这个9必须在开头
$                         匹配字符串的结尾 eg:9$ 找9并且这个9必须在末尾
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重复14次 组成15位的一串数字
 ^[1-9][0-9]{16}[0-9x]  # 第一位1-9开头 0-9重复16次 最后一位可以是0-9或者x
  
# 校验邮箱、快递单号、座机号...
	"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""

  

  取消转义

\n				\n	 False  # 斜杠加字母有特殊含义

\\n				\n	 True  # 加斜杠取消特殊含义

\\\\n			    \\n     True	  # 双斜杠用来取消双斜杠加字母的特殊含义

在python中还可以在字符串的前面加r取消转义 更加方便

  

  贪婪匹配和非贪婪匹配

贪婪非贪婪通常都是利用左右两边的条件作为筛选依据

# 正则			# 待匹配的文本	        # 结果
<.*>		<script>alert(123)<script>       1条	贪婪匹配
		以最后一个大括号的出现作为结束标志
<.*?>           <script>alert(123)<script>	 2条   非贪婪匹配
		以第一个大括号的出现作为结束标志
  
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可

  

  re模块

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'))  # 写一遍之后 直接反复调用即可

  

 

posted @ 2022-03-28 21:54  ji哩咕噜  阅读(29)  评论(0编辑  收藏  举报