Python笔记:正则表达式

1、介绍

文本模式匹配工具,可以匹配普通字符、特殊字符等
查找、替换、验证、提取文本
格式:/pattern/flags
pattern:模式。各种符号和元字符等组成
/:包围正则表达式的模式
flags:修饰符。控制匹配方式


2、模式

2.1、元字符

\d 匹配数字
\D 匹配非数字
\w (小写w)匹配字母、数字和下划线,相当于[a-zA-Z0-9_]
\W(大写W) 匹配非字母、数字和下划线外的字符,相当于[^a-zA-Z0-9_]
\s(小写s)匹配空白字符,包括空格、制表符\t、换行符\n,回车\r 换页\f 垂直制表符\v
\S(大写S)匹配非空白字符,包括空格、制表符、换行符等

2.2、量词

+ 前面字符至少出现(1次或多次)
* 前面字符0次或1次或多次
? 前面字符最多出现1次(0次或1次)
{n} 匹配n次
{n,} 前面字符至少出现n次
{n,m} 前面字符至少出现n次,至多出现m次

* + 贪婪模式,尽可能多的匹配字符
? 非贪婪模式,最小匹配
*?+?{n}?,{n,}?,{n,m}?

2.3. 特殊字符

. 匹配除换行符外的任意单个字符
\ 转义字符
| 管道,多个表达式中任意一个,表示“或”关系

2.4、字符类

[] 字符集合中任一字符。例如,[A-Z]匹配所有大写字母
[^] 不在字符集合中的任意一个字符
- 连接符,在字符集中表示范围,如,[a-z] 任意小写字母

中括号中包含连接符
[-] :反斜杠转义连接符
[-a],[a-] 连接符放在开始或结尾

2.5、定位符

边界匹配
$ 字符串结尾
^ 匹配字符串的开始
\b 匹配单词的边界
\B 非单词边界

定位符与限定符(即量词)不可紧靠使用,如^*无效

2.6、分组和捕获

( )分组 和捕获子表达式
(? ) 分组但不捕获子表达式

断言:
引申1: 反向预查?=?<=?!?<!
exp1(?=exp2) 查找exp2前面的exp1
(?<=exp2)exp1 查找exp2后面的exp1
exp1(?!exp2) 查找后面不是exp2的exp1
(?<!exp2)exp1 查找前面不是exp2的exp1
引申2:正向预查?: 同(),但(?:exp)不获取匹配结果
反向预查和正向预查,可消除()的缓存(分组副作用:缓存)
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符后开始(不太理解)

重命名(?<name>)
分组捕获的值,赋值给name

2.7、反向引用

\num (其中num为具体数字,如1,2,3)
用来引用前面捕获组()中匹配的内容;其中num表示第num个匹配的引用
如,\b(\w+)\b\s+\1\b

  • \b(\w+)\b 捕获一个单词
  • \s+\1 匹配与捕获到的第一个单词一致的内容
    “\数字” 反向引用的展示

3、修饰符

  • i 不区分大小写
  • g 全局匹配,即匹配所有而非仅匹配第一个
  • m 多行匹配,即^和$匹配字符串中每一行的开头和结尾
  • s 单行模式:.可匹配换行符在内的所有字符
  • u Unicode模式
  • y 粘性模式:从目标字符串的当前位置开始匹配。类似^,但是针对的是匹配的起始位置
  • x 扩展模式:忽略模式中的空白和注释(Python中re.VERBOSE

如:gi :全局匹配+忽略大小写,如email
ims 忽略大小写+多行模式+点号匹配换行符(日志分析)
gu 全局匹配+Unicode(Unicode表情符号)


4、优先级

从左到右进行计算

  • \ :转义符
  • (),(?:),(?=),[] :圆括号和方括号
  • *,+,?,{n},{n,},{n,m} :量词(限定符)
  • ^,$,\d等元字符,任何字符 :定位点和序列
  • |管道

5、实例

5.1 匹配邮箱 :用户名@域名

用户名:字母、数字、下划线、点号、百分号、加号和减号
/\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g
\. 转义字符匹配.;否则匹配除换行外的任一字符
更严谨^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

5.2 匹配URL

^(https?|ftp):\/\/[^\s/$.?#].[^\s]*
^(https?|ftp):匹配以http,https或ftp开头的协议部分
[^\s/$.?#] :除空格、斜杠、文化、点号、井号之外的字符,表示主机名部分

5.3 密码强度校验

.*(?=.{8,20})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*])
8-20位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符

  • (?=.*\d) 必须包含至少1个数字
  • (?=.*[A-Z]) 必须包含至少1个大写字母
  • (?=.*[a-z]) 必须包含至少1个小写字母
  • (?=.*[!@#$%^&*]) 必须包含至少1个特殊字符(特殊字符范围:!@#$%^&*
    AI优化:
    ^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?_])[a-zA_Z\d!@#$%^&*?_]{8,20}$
  1. ^ $添加锚点,确保开头和结尾匹配,避免部分匹配导致的安全漏洞。如Aa1@qwertyuiopasdfghjk(之前校验通过,但是实际错误,因长度=21)
  2. 独立断言条件(?=)
  3. 主模式限制:[a-zA_Z\d!@#$%^&*?_]{8,20}

4.4 其他

  • 中文字符:[\u4e00-\u9fa5]
  • 空白行:\n\s*\r

6、参考

6.1、正则表达式 – 简介 | 菜鸟教程
6.2、正则表达式在线测试 | 菜鸟工具
6.3、正则表达式语法,正则表达式速查表-在线工具箱

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容