正则

发布时间 2024-01-04 16:31:01作者: Formerly0^0

正则导读

正则之字符组

  • [字符组] 在同一个位置可能出现的各种字符组成了一个字符组
    • []
[0123456789]   # 匹配0-9中某个字符的单个结果   
[0-9]					 # 匹配0-9中某个字符的单个结果   
[a-z]					 # 匹配a-z中某个字符的单个结果
[A-Z] 				 # 匹配A-Z中某个字符的单个结果
[0-9a-zA-Z]		 # 匹配数字或小写字母或大写字母的单个结果

正则之元字符

  • 以特殊字符组合而成,代表特殊含义的组合
. 						 # 只能匹配除换行符以外的任意字符
\w 						 # 只能匹配字母或数字或下划线,也不能匹配换行符
\s						 # 只能匹配任意的空白符(其实就是空格)
\d						 # 只能匹配任意的数字
\n						 # 匹配换行符(其实就是回车键)
\t						 # 匹配制表符(其实就是tab键)
\b						 # 匹配一个单词的结尾

\W 					   # 不能匹配字母或数字或下划线,也不能匹配换行符
\D						 # 不能匹配任意的数字
\S						 # 不能匹配任意的空白符(其实就是空格)

^ 						 # 匹配字符串的开始的字符
$							 # 匹配字符串的结尾的字符
|							 # 管道符,表示或 前面的字符或者后面的字符
()						 # 优先匹配括号内部的表达式
[]						 # 匹配到字符组内的字符
  • 在【Python中的特殊转义符
\n 换行
\t 制表
\\ 取消转义

正则之量词

  • 其实就是控制我们正则表达式中匹配到的字符出现的次数
* 						 # 可以重复零次或更多次 (默认都是贪婪匹配,按最多的取)
+							 # 可以重复一次或更多次
? 						# 可以重复零次或一次
{}						 # 可以控制字符重复的次数
{n,}					 # 从重复 n 次开始,最低最低你要重复 n 次,多的就是更多次
{n,m}					 # 从重复 n 次开始 ,知道 m 次结束

正则表达式的使用场景

  • 在爬虫兴起的时候。正则非常火,但是正则表达式太复杂了
  • 在爬虫发展过程中那个,随着大佬们技术的兴起
    • Bs4 -- beautifulsoup
      • 比正则好用一些
    • Lxml --- etree
      • 将文档实例化成HTML对象
      • 你只需要在页面上找对相应的位置,直接复制表达式,就能完成匹配工作
  • 晚上大多数案例其实都是用正则写的
  • 现在正则表达式大多数都用来
    • 校验我们的参数格式
      • 手机号格式
      • 邮箱号格式
      • 身份证号
  • 正则表达式,你只要写错一个字符的匹配格式,你整个正则表达式都不会起作用
  • 想要正则表达式
    • 首先不要自己去想,去写,你自己写的 99% 都是错的
    • 问百度,搜相关关键字,网上会有大佬们写现成的正则表达式
    • 扔给GPT,让GPT帮你生成正则表达式
    • 测试正则表达式 --- 需要自己结合自己的需求进行完善
  • 有一个很重要的前提是:你必须能看懂!
  • 只要思想不滑坡,办法总比困难多!
  • 懂得取舍和思考解决办法,不要死板

正则小练习之重复匹配

  • 位置元字符练习
海.      海燕海娇海东王			海燕海娇海东
^海.     海燕海娇海东王			海燕
海.$			海燕海娇海东			 海东		
  • 重复匹配练习
李.?  		李杰和李莲英和李二棍子		李杰 李莲 李二
# ? 可以出现 0 次 或者 1 次,默认都是最多次
# ? 是对 . 起作用的 
# 意思就是 . 可以出现 0 次 李 
# 可以出现一次 李.

李.*			李杰和李莲英和李二棍子    李杰和李莲英和李二棍子 
# * 可以出现零次或更多次,默认是更多次  
# * 是 对 . 起作用的
# . 可以出现 0 次 李
# . 可以出现无数次 李..........

李.+			李杰和李莲英和李二棍子		 李杰和李莲英和李二棍子 
# + 可以出现 1 次或更多次,默认是更多次

李.{1,2} 李杰和李莲英和李二棍子  	 李杰和 李莲英 李二棍
# {n,m} 重复 n 次到 m 次,最少 n 次,最多 m 次
# 李.. 重复匹配 李+任意两个字符

正则小练习之字符集

李[杰莲英二棍子]*  李杰和李莲英和李二棍子  李杰 李莲英 李二棍子
# [] : 字符组,取字符组中的任意一个
# * 可以重复无数次

李[^和]*					李杰和李莲英和李二棍子  李杰 李莲英 李二棍子

[\d]		456db4	  4 5 6 4
[\d]+		456db4    456 4
# + 可以重复一次或更多 

正则小练习之分组匹配

^[1-9]\d{13,16}[0-9x]$	110101198001017032	110101198001017032	表示可以匹配一个正确的身份证号
^[1-9]\d{13,16}[0-9x]$	1101011980010170	1101011980010170	表示也可以匹配这串数字,但这并不是一个正确的身份证号码,它是一个16位的数字
^[1-9]\d{14}(\d{2}[0-9x])?$	1101011980010170	False	现在不会匹配错误的身份证号了 ()表示分组,将\d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
`^([1-9]\d{16}[0-9x]	[1-9]\d{14})$`	110105199812067023	110105199812067023

正则之非贪婪模式

  • ?取消非贪婪模式
    • 前提是你这个匹配条件支持贪婪模式
  • 几个常用的非贪婪匹配,Pattern
  • *? 重复任意次,但尽可能少重复
  • +? 重复1次或更多次,但尽可能少重复
  • ?? 重复0次或1次,但尽可能少重复
  • {n,m}? 重复n到m次,但尽可能少重复
  • {n,}? 重复n次以上,但尽可能少重复