在python中,内置re模块,通过re模块,来操作正则表达式
什么是正则表达式?
一套规则,匹配字符串的
一些网站中有正则表达式模块,可以参考,通过百度搜索就行
字符组
字符组:描述的是一个位置上能出现的所有可能性写在[]中,一个中括号只表示一个字符位置,匹配多个位置的字符就写多个中括号
接受范围,可以描述多个范围,连着写就可以了
匹配原理:根据ASCII进行范围的比对
[abc]: 匹配a或者b或者c,其中的一个
[0-9]:数字0-9中的任意一个
[a-z]:小写字母a-z中的任意一个
[A-Z]:大写字母A-Z中的任意一个
[A-z]:不推荐,因为中间还有一些其他字符
[a-zA-Z] :大小写字母中的任意一个
[0-9a-z]:数字小写字母中的任意一个
[0-9a-zA-Z]:数字大小写字母中的任意一个
元字符
在正则表达式中能够帮助我们表示匹配的内容的符号都是正则中的元字符(就是匹配内容的规则)
字符组也是元字符
元字符是匹配内容的规则
元字符都是表示能匹配哪些内容,一个元字符总是表示一个字符位置上的内容
元字符 | 匹配内容 | 元字符 | 匹配内容 |
---|---|---|---|
. | 匹配除换行符以外的任意字符 | \w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 | \d | 匹配数字 |
\n | 匹配一个换行符 ,enter键 | \t | 匹配一个制表符,tab键 |
\b | 匹配一个单词的结尾 | a|b | 匹配字符a或字符b |
^ | 匹配字符串的开始,只存在最前面 | $ | 匹配字符串的结尾,只存在最后面 |
\W | 匹配非字母或数字或下划线 | \D | 匹配非数字 |
\S | 匹配非空白符 | () | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 | [^...] | 匹配除了字符组中字符的所有字符(非字符组,写在里面的都不匹配) |
[0-9]等同于\d,表示匹配一位任意数字,全称digit
[0-9a-zA-Z_]等同于\w,表示匹配数字字母下划线 ,全称word
空格:空格就是空格
[\d\D]、[\w\W]、[\s\S] 表示匹配所有
.:匹配除了换行符之外的所有,匹配一个,可以通过一些配置将换行符也进行匹配
\.:表示一个点
ing\b:以ing结尾的单词
空白用代码的描述
tab 制表符:\t
enter回车:\n
空白:空格,tab和回车 , \s 表示所有空白 包括空格 tab和回车)
分组(),约束元字符或或的作用范围
或 |
a表达式|b表达式
匹配a或者b表达式中的内容,如果匹配a成功了,不会继续和b匹配, 所以,如果两个规则有重叠部分,总是把长的放在前面,优先匹配
www\.(|baidu|jd|youku)\.com
# 匹配百度、京东、优酷中任意一个网址
分组()
约束 | 描述的内容的范围问题,只在括号里面生效
匹配一个数:
\d+(\.\d+)?
# 匹配一个数,将小数点与后面的整数分组
量词
用来约束前面一个元字符位置的次数
- {n} 表示匹配n次
- {n,} 表示匹配至少n次
- {n,m}表示至少匹配n次,至多m次
- ? 表示匹配0次或1次 ,可以写为{0,1}
- + 表示1次或多次 ,可以写为 {1,}
- * 表示0次或多次 ,可以写为 {0,}
现象
贪婪匹配现象
在量词范围允许的情况下,尽量多的匹配内容,这是基于内部的回溯算法
回溯算法:回溯的本质是穷举,穷举所有可能
.*x :表示匹配任意字符任意多次数遇到最后一个x才停下来
\d{3,9}
#有9个直接匹配9个内容
非贪婪(惰性)匹配
在条件允许的情况下尽量少的匹配
.*?x :表示匹配任意字符 任意多次数 但是一旦遇到x就停下来
元字符 量词 ?
\d{3,}?6
# 遇见第一个6就停下来
转义符
在特殊符号前面加一个反斜杠就是转义符
- 原本有特殊意义的字符,到了表达它本身的意义的时候,需要转义
- 有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义
- [().*+?] 所有的内容在字符组中会取消它的特殊意义
- [a-c] -在字符组中表示范围,如果不希望它表示范围,需要转义,或者放在字符组的最前面\最后面
用途
- 检测一个输入的字符串是否合法
web开发项目 表单验证等
用户输入一个内容的时候,我们要提前做检测,能够提高程序的效率并且减轻服务器的压力 - 从一个大文件中找到所有符合规则的内容
日志分析\爬虫等
能够高效的从一大段文字中快速找到符合规则的内容