正则表达式是什么?
正则表达式本身和python没有什么关系, 就是匹配字符串的一种规则
正则是一种独立的规则,独立的语言, 只和字符串打交道
在线测试工具 http://tool.chinaz.com/regex/
正则表达式可以做什么?
1.把一个文件中所有的手机号都找出来 (*** 从大段的文字中找到符合规则的)
open打开文件
读文件 str
从一长串的字符串中找到所有11位数字
2.注册账号的时候需要输入手机号 (*** 判断某个字符串是否完全符合规则)
验证手机号是否合法
给手机号发送验证码
用户填写验证码
完成注册
正则表达式作用(****非常重要****):
1.从大段的文字中找到符合规则的内容(对正则的要求很高)
爬虫: 从网页的字符串中获取你想要数据
日志分析(数据分析)
什么是日志: 在什么时间点在哪花多少钱就是一条日志
例如: 2018-8-12 10:00:00 楼下早点摊 $3.00
2.判断某个字符串是否完全符合规则
表单验证:手机号,qq号,邮箱,银行卡,身份证,密码
字符组:[字符组]
在同一个位置可能出现的各种字符组成的一个字符组, 在正则表达式中用[]表示
字符分很多类, 比如数字, 字母, 标点等
正则: [0123456789] 待匹配字符: 5 匹配结果: True 说明: 枚举所有的字符,字符组里任意一个字符和待匹配字符相同, 都认为是可以匹配 正则: [012345] 待匹配字符: a 匹配结果: False 说明: 由于字符组中没有"a"字符,所以不能匹配 正则: [0-9] 待匹配字符: 8 匹配结果: True 说明: [0-9]就和[0123456789]是一个意思 正则: [a-z] 待匹配字符: b 匹配结果: True 说明: [a-z]表示所有小写字母 正则: [A-Z] 待匹配字符: B 匹配结果: True 说明: [A-Z]表示所有大写字母
*** 一个字符组只约束一个字符 字符组:[] 写在中括号中的内容都可以出现在下面的某一个位置上 [0-9] 匹配数字 还可以写[4-9] 都是从小到大的顺序 不能写[9-4] [a-z] 匹配小写字母 [A-Z] 匹配大写字母 A-Z 65-90 ascii码 a-z 97-122 ascii码顺序 90-97之间还有一些其他的字符 [a-zA-Z] 匹配出所有的大小写字母 [a-zA-Z0-9]匹配大小写字母和数字 [a-zA-Z0-9_]匹配数字字母下划线
字符
w 匹配数字字母下划线 word关键字[a-zA-Z0-9_]; \w的结果是w d 匹配数字 digit [0-9] s 匹配空格,回车,tab制表符 匹配一个tab 匹配回车 直接敲空格键 匹配一个空格 W 非数字字母下划线 D 匹配除了数字之外的 S 匹配除了空白之外的 [sS][dD][wW],是三组匹配所有的字符 表示单词的边界 k找到以k开头的单词 ing找到以ing结尾的单词
^ 开始符 匹配开头 只能出现在字符串的开始
$ 结束符 匹配最后一个字符 只能出现在字符串的结尾
^ddddddddddd$ 验证电话号
1dddddddddd
1d{10} 10是约束d的 d直接重复10次
.表示匹配除了 换行符 之外所有的字符 .代表1个字符
[]字符组 只要出现在中括号里的内容都可以被匹配(一个字符组只能匹配一个字符)
[^] 只要不出现在中括号里的内容才可以被匹配 尖叫号^ 必须写在最前面
有一些有特殊意义的元字符,进入字符组中,会恢复它原有意义
放在字符组里现原形的有: . | [] () 这四个
a|b 或 符合a规则的或者符合b规则的都可以被匹配
如果a规则是b规则的一部分,并且a规则比b规则要苛刻/长, 把a写在前面
() 表示分组 表示给几个字符加上量词约束的需求的时候用
量词: ? + * {n} {n,} {n,m} {n}表示 这个量词之前的字符出现n 次 {n,} 表示至少出现n 次 {n,m} 表示出现 n 到 m 次 ?表示匹配量词之前的字符出现 0次 或者 1次, d? 表示某个数字可有可无的时候 +表示匹配量词之前的字符出现 1次 或者 多次 d+ *表示匹配量词之前的字符出现 0次 或者 多次
可以根据下图记忆 ? + *
.^$的用法:
正则: 海.
待匹配字符: 海燕海娇海东
匹配结果: 海燕海娇海东 匹配到了 3次 结果
说明: 匹配所有"海." 的字符
正则: ^海.
待匹配字符: 海燕海娇海东
匹配结果: 海燕 匹配到了 1次 结果
说明: 从开头匹配"海."
正则: 海.$
待匹配字符: 海燕海娇海东
匹配结果: 海东 匹配到了 1次 结果
说明: 只匹配结尾的"海.$"
* + ? {}的用法:
正则: 李.? (.只表示一个字符)
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰 李莲 李二 3个结果
说明: ?表示重复 0次 或者 1次, 就是只匹配"李"后面一个任意字符
正则: 李.*
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰和李莲英和李二棍子 1个结果
说明: *表示重复0次 或者 多次, 就是匹配"李"后面0个 或者 多个字符
正则: 李.+
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰和李莲英和李二棍子 1个结果
说明: +表示重复1次 或 多次, 就是匹配"李"后面1个 或 多个任意字符
正则: 李.{1,2}
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰和 李莲英 李二棍
说明: {1,2}匹配 1到2 次任意字符
注意:前面的 * + ? 都是贪婪匹配,就是尽可能多的匹配, 后面加 ?号就变成了惰性匹配
正则: 李.*?
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李 李 李 3个结果
说明: 惰性匹配 因为* 最少是0 所以就匹配到"李"后面的第0个
正则: 李.+?
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰 李莲 李二 3个结果
说明: 惰性匹配 因为+ 最少是1 所以就匹配到"李"后面的第1个
正则: 李.??
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李 李 李 3个结果
说明: 惰性匹配 因为? 最少是0 所以就匹配到"李"后面的第0个
字符集 [] [^]的用法:
正则: 李[杰莲英二棍子]*
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰 李莲英 李二棍子
说明: 表示匹配"李"字后面[杰莲英二棍子]的字符任意次
正则: 李[杰莲英二棍子] (**一个字符组只能约束一个字符)
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰 李莲 李二
说明: 一个字符组只能约束一个字符
正则: 李[^和]*
待匹配字符: 李杰和李莲英和李二棍子
匹配结果: 李杰 李莲英 李二棍子
说明: 匹配一个不是"和"的字符任意次
正则: [d]
待匹配字符:456abcd3
匹配结果: 4 5 6 3
说明:匹配任意一个数字 4个结果
正则: [d]+
待匹配字符: 456abcd3
匹配结果: 456 3
说明: 匹配任意数字 2个结果
分组()与 或|[^]的用法:
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能是0;
如果是18位,则前17位全部是数字,末尾可能是数字或者X,下面用正则来表示一下
正则:^[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})$
待匹配字符:110101198001017032
匹配结果:110101198001017032
说明: 表示先匹配[1-9]d{16}[0-9x],如果没有匹配上就匹配[1-9]d{14}
转译符:
在正则表达式中,有很多有特殊意义的是元字符, 比如d和s等,如果在正则中匹配正常的"d"而不是"数字"就需要
对""进行转义,变成"\"
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现,在字符串中也是有特殊意义,本身还需要转义.
如果匹配一次"d",字符串就写成"\d",那么正则里就要写成"\\d",这样就太麻烦了.
这时候我们就要用r"d",此时的正则是r"\d"就可以.
正则: d
待匹配字符: d
匹配结果: False
说明: 因为在正则表达式中 是有特殊意义的字符, 所以要匹配d本身,用d表达式无法匹配
正则: \d
待匹配字符: d
匹配结果: True
说明:转义 之后变成\, 就可以匹配
正则: "\\d"
待匹配字符: "\d"
匹配结果: True
说明: 如果在python中, 字符串中的""也需要转义,所以每一个字符串""又需要转义一次
正则: r"\d"
待匹配字符: r"d"
匹配结果: True
说明:在字符串之前加r, 让整个字符串不转义
贪婪匹配:在满足匹配时, 匹配尽可能长的字符串, 默认情况下采用贪婪匹配
正则:<.*>
待匹配字符: <script>...<script>
匹配结果: <script>...<script>
说明: 默认是贪婪匹配,会匹配尽量长的字符串
正则:<.*?>
待匹配字符: <script>...<script>
匹配结果: <script>
<script>
说明: 加上?把贪婪算法转成了非贪婪算法,会匹配尽可能短的字符串
.*?x 匹配任意非换行符字符任意长度,直到遇到x 停止. 这里的x 就是>
几个字符的组合关系:
字符 或者 元字符 只约束一个字符
字符+量词 约束一个字符连续出现的次数
字符+量词+? 约束一个字符连续出现的最少次数
字符+量词+?+x 约束一个字符连续出现量词范围
关于字符串挪到 python中的转义问题:只需要在python里的表达式前加r
print(r" ")
print(r"\n")
普通字符就表示一个正常的字符
元字符表示它特殊的意义, 如果元字符转义,就失去了特殊意义