Python进阶之正则表达式
概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
目的
符号
正则 |
待匹配字符 |
匹配 |
说明 |
[0123456789] |
8 |
True |
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符 |
[0123456789] |
a |
False |
由于字符组中没有"a"字符,所以不能匹配 |
[0-9] |
7 |
True |
也可以用-表示范围,[0-9]就和[0123456789]是一个意思 |
[a-z] |
s |
True |
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 |
[A-Z] |
B |
True |
[A-Z]就表示所有的大写字母 |
[0-9a-fA-F] |
e |
True |
可以匹配数字,大小写形式的a~f,用来验证十六进制字符 |
字符
元字符 |
匹配内容 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W |
匹配非字母或数字或下划线 |
\D |
匹配非数字
|
\S |
匹配非空白符
|
a|b |
匹配字符a或字符b |
() |
匹配括号内的表达式,也表示一个组 |
[...] |
匹配字符组中的字符 |
[^...] |
匹配除了字符组中字符的所有字符 |
量词
量词 |
用法说明 |
* | 重复零次或更多次(贪婪匹配) |
+ | 重复一次或更多次(贪婪匹配) |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
实例
匹配任意数字
匹配任意小写字母
匹配任意大写字母
[A-Z] ----ABC123DEF456只要字符串中包含任意大写字符,都会被匹配匹配数字+小写字母+大写字母
\w与\W与[\w\W](匹配所有字符)



\s与\S与[\s\S](匹配所有字符)
\d与\D与[\d\D](匹配所有字符)
\n与\t(tab制表符与\b
^(匹配一个字符串的开头) 与$
(匹配以[a-z]开头,以[a-z]结尾的字符串,这里只能匹配2个字符的字符串,因为[]代表一个字符组)
a|b(从左向右匹配,优先匹配a)
(左边匹配了,右边不会再匹配)
[^...]
组合练习
*+?{}
待匹配字符串 | 正则表达式 | 匹配结果 | 说明 |
小李和小王和小亮 小李和小王王和小亮亮亮 |
[^和]+ |
小李 小李 |
匹配非'和'的所有字符串多次 |
小李和小王王和小亮亮亮 | [^和]{2,4} | 小李 小王王 小亮亮亮 |
匹配非‘和’的所有字符串2到4次 |
小李和小王王和小亮亮亮 | [^和]{2,4}? | 小李 小王 小亮 亮亮 |
匹配非‘和’的所有字符串2次 |
小李和小王王和小亮亮亮 | 小.? | 小李 小王 小亮 |
匹配小后面任意字符0次或1次 |
小李和小王王和小亮亮亮 | 小.* | 小李和小王王和小亮亮亮 | 匹配小后面任意字符0次或多次 |
小李和小王王和小亮亮亮 | 小.+ | 小李和小王王和小亮亮亮 | 匹配小后面任意字符一次或多次 |
小李和小王王和小亮亮亮 | 小.{1,2} | 小李和 小王王 小亮亮 |
匹配小后面任意字符一次到2次 |
小李和小王王和小亮亮亮 | 小.*? | 小 小 小 |
匹配小后面任意字符0次(因为有?限制,表示匹配最少的页就是0次即什么都不匹配) |
字符集[] [^]
待匹配字符串 | 正则表达式 | 匹配结果 | 说明 |
小李和小王王和小亮亮亮 | 小[李王王亮亮亮]* | 小李 小王王 小亮亮亮 |
匹配小后面字符组里面任意字符0次或多次 |
小李和小王王和小亮亮亮 | 小[^和]* | 小李 小王王 小亮亮亮 |
匹配小后面非和子的任意字符0次或多次 |
123abc345 | [\d] |
1 2 3 3 4 5 |
匹配任意一个数字 |
123abc345 | [\d]* |
123 345 |
匹配任意多个数字 |
123abc345 | [\d]+ |
123 345 |
匹配任意多个数字 |
分组()与或 | [^]
匹配15位或18位身份证,15位需都是数字组成,18位可以是数字或x结尾,首位都不能为0
待匹配字符串 | 正则表达式 | 匹配结果 | 说明 |
110621199012014599 | ^[1-9]\d{13,16}[0-9x]$ | 110621199012014599 | 可以匹配到一个正确的身份证,但是如果是16位1106211990120145也同样能匹配到,但是这并不是身份证 |
^[1-9]\d{14}(\d{2}[0-9x])?$ | 不会再匹配错误的身份证(你可以试试的) | ||
110621199012014599 | ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ | 110621199012014599 | 这个是比较好的表达式,先匹配18位,再匹配15位 |
总结
要想熟练的使用正则表达式,还是要多练多写吧! 希望大家能像计算1+1=2这么简单的使用正则表达式
----------------------------真正的勇士, 敢于直面惨淡的Warning、 敢于正视淋漓的Error--------------------------
版权声明
出处: 博客园Linux超的技术博客--https://www.cnblogs.com/linuxchao/
您的支持是对博主最大的鼓励,感谢您的认真阅读
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者: Linux超
· 一个字符串替换引发的性能血案:正则回溯与救赎之路
· 为什么说方法的参数最好不要超过4个?
· C#.Net 筑基-优雅 LINQ 的查询艺术
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 发布一个小功能,通过 markdown 图片语法嵌入B站视频
· 《HelloGitHub》第 111 期
· 使用GcExcel .NET将Excel导出为PDF
· MySQL 字符集、排序规则与查询关系详解
· 本地搭建一个对嘴AI工具