# 34. 正则表达式
# 正则表达式
# 正则表达式概念
先来明确一件事
- 正则表达式是一种独立的语法
- 不是python的功能,python只是用到这个语法
- 正则表达式比Python还久远
什么是正则表达式
- 什么是正则表达式
- 一种匹配字符串的规则
- 比如匹配用户输入的一串数据
- 判断是不是QQ号
- 判断是不是手机号
- 判断是不是身份证
- 等等等......
- 比如有一个用户文件数据
- 可以把文件中的数据进行分析
- 提取出手机号
- 提取出用户名
- 提取出爱好
- 等等等......
那正则表达能做什么
- 可以定制一个规则,让程序按这规则来判断
- 可以来判断某一串数据是不是符合规则
- 可以从大量数据中找到符合规则的内容
- 程序领域
- 可以用于登录注册页的表单验证
- 可以用于爬虫过滤、分析等
- 可以用于运维开发的数据分析
- 可以用于数据分析
总结
- 学re模块
- 先学正则表达式语法、
- 在学怎么用python来操作正则
- 正则表达式在线测试网站:http://tool.chinaz.com/regex/
# 正则表达式之字符组
字符组,就是以 [ ] 为一个范围
- 如果只有单个[ ] ,
- 那么就代表匹配[ ]中的规则,注意:[ ]中每一个字符都代表匹配一次
- 如果单个 [ 0 - 9 ],就相当匹配数据中的所有数字
- 如果单个 [ a - z ],就相当匹配数据中的所有小写字母
- 如果单个 [ A - Z ],就相当匹配数据中的所有大写字母
- 如果单个 [ 0 - 9 a - z A - Z ],就相当匹配数据中的所有数字、小写字母、大写字母
- 如果单个 [ 0 - 9 A - z ],就相当匹配数据中的所有数字、小写字母、大写字母
- 如果单个 [ 0 - 9 a - f A -F ],就相当匹配数据中数字,大小写形式的a~f,用来验证十六进制字符
- 如果有多个[ ]
- 那么就代表匹配多个字符
- [] [] 二个中括号就代表匹配二个字符
- [] [] [] 三个中括号就代表匹配三个字符
- [ ]中的操作跟上面单个[] 一样
- 那么就代表匹配多个字符
- 匹配身份证:[1-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9xX]
# 正则表达式之元字符
元字符:提供简写的字符组
以下按博主习惯分个类
- 常用正反元字符法
- 正
- \w :匹配字母跟数字跟下划线,简单来说,就匹配字母、数字、下划线的任意内容
- \d :匹配数字,简单来说匹配所有数字
- \s :匹配任意的空白符,简单来说,就是匹配,换行符,空格符,制表符(Tab键符)
- \t :匹配一个制表符(Tab键符)
- \n :匹配一个换行符
- 反
- \W :匹配非字母跟数字跟下划线,简单来说,就匹配除了字母、数字、下划线的所有内容
- \D :匹配非数字,简单来说匹配除了数字的所有内容
- \S :匹配非空白符,简单来说,就是匹配除了换行符、空格符、制表符(Tab键符)的所有内容
- \t :匹配一个制表符(Tab键符)
- \n :匹配一个换行符
- 正
- 取头断尾法
- ^ :匹配字符串的开始,简单来说,就是匹配这串字符串是否以这规则开头
- $ :匹配字符串的结尾,简单来说,就是匹配这串字符串是否以这规则结尾
- ^ 值 $ :匹配字符串是否以指定的规则开头跟结尾
- or法
- a|b :匹配字符是否是a或b,注意:如果使用这种,字符长的一定要放在第一们,因为 | 的执行很简单,找到一个后就不会找另一个,比如 ab|abb,字符串:abbabbbbbbbbbb,那么他就只会找到ab,就不会匹配到abb
- 取反法
- [^a] : 匹配除了字母a以外的所有字符
- .符匹配法
- . :.元字符匹配任意一个数,除了换行符
- 分组法
- ():匹配括号内的表达式,也表示()内的表达式为一个组
# 正则表达式之量词
量词:量词就是在元字符的后一位使用的
- *:匹配零次或多次,简单说,匹配没有或无限次
- +:匹配前一个值重复一次或更多次
- ?:匹配前一个值重复零次或一次
- {} :重复次数
- {n}:重复次数,如{1},那么前一个值重复1次
- {n,}:重复n次或更多次,如{1,},那么前一个值重复1次以上无限数
- {n,m}:重复n次或m次,如{2,4},那么前一个值至少重复2次,最多重复4次
惰性匹配
惰性匹配:在量词后面加上?号
因为量词默认都是贪婪匹配,贪婪匹配:尽可能的匹配多的可能性
惰性匹配,让量词从贪婪匹配变成惰性匹配,惰性匹配:尽可能的匹配少的可能性
- ?? :重复0次或1次,但尽可能少重复
- *? :重复任意次,但尽可能少重复
- +? :重复1次或任意次,但尽可能少重复
- {n,}? :重复n次以上,但尽可能少重复
- {n,m}?:重复n次到m次,但尽可能少重复
匹配身份证
身份证有15位的老身份证,也有18位的新身份证
那使用正则表达式要怎么查找出来
^[1-9]\d{14}(\d{2}[0-9x])?$
^[1-9]\d{16}[0-9x]|^[1-9]\d{14}
匹配字符串直到出现指定的值
.*?a
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式
# 正则表达式之转意符
转意符:\ ,其实也很简单,只要把想转意的在前面加个\ 就行
比如想把匹配 \n ,但是\n在表达式中有着特别的意义,如果想匹配,就需要 \n 就可以了
但是,在表达中 [ ] 中括号中有先一些特殊字符现出有所原型,不用转意
- [ () + * ? $ . ]:这一些都是不用加转意符就可以自己转意,都是中括号的功劳
- [ \w \d \s(\n,\t, ) \W \D \S ]:这一些就,想要让他们现出原型,就要使用转意符
关于 [ - ]:
- [ - ]:只有写在字符组的首位的时候表示普通的减号
- [ - ]:写在其他的位置的时候,表示范围[ 0-9 ]
- [ - ]:如果不想让他表示范围,用于单纯的 - 字符,需要使用转意符 [ 1 - 9 ]
# 正则表达式之练习题
题目 | 答案 |
---|---|
1、匹配任意长度的正整数 | [1-9]\d* |
2、匹配小数 | -?\d+.\d+ |
3、匹配整数或者小数 | -?\d+(.\d+)? 准确的 -?\d+.?\d* :有缺陷 1. 2. 这样的内容都能被匹配上 -?\d+.?\d+:有缺陷 1 2 这样的一位数都匹配不上了 |
4、匹配负数 | -0.\d+|-[1-9]\d+(.\d+)? |
5、匹配qq号 | [1-9]\d{4,11} |
6、匹配长度为11位的电话号码 | 1[3-9]\d{9} |
7、长度为8-10位的用户密码 | [\w@?]{8,10} |
8、匹配验证码:4位数字字母组成的 | [\da-zA-Z]{4} |
1-2*((60-30+(-40/5)(9-25/3+7/399/42998+10568/14))-(-43)/(16-3*2)) 从上面算式中匹配出最内层的小括号 | ([\d.+-*/]+) ([^( )]+) |
[^()]: