正则表达式
正则表达式是一种规则,只作用于字符串,正则是一套独立的规则,也可以说是一套独立的语言,几乎现有的高级语言都引入了正则的使用,python也不例外,先看看正则的语法特性。
1. 正则一般都用来做什么?
1⃣️. 从大段的文字中找到符合规则的内容并进行提取。
日志分析:从nginx日志中找出当前访问有个某个指定url的日志并进行保存。
网页爬虫:获取某网页所有图片的url地址
2⃣️.判断某个字符串是否完全符合规则
表单验证:注册时判断用户名,密码,身份证号,手机号是否符合规则
2.正则表达式的语法及规则
#规则, 字符串, 从字符串中找到符合规则的内容
1⃣️字符组:[] 写在中括号中的内容,出现在下面某一个字符的位置上都死符合规则的。
[0-9] | 匹配数字 |
[a-z] | 匹配小写字母 |
[A-Z] | 匹配大写字母 |
[a-zA-Z] | 匹配大小写字母 |
[a-zA-Z0-9] | 匹配大小写字母和数字 |
[a-zA-Z0-9_] | 匹配大小写字母和数字下划线 |
2⃣️元字符: 在正则表达式中包含特殊意义的字符
\w | 匹配数字字母下划线(word) | [a-zA-Z0-9] |
\d | 匹配所有的数字(digit) | [0-9] |
\s | 匹配所有的空格 换行符 制表符 空格 | [\n\t ] |
\n | 匹配换行符 | |
\t | 匹配制表符 | |
\W | 匹配非数字字母下划线的其他字符 | 与\w取反 |
\D | 匹配非数字的所有其他字符 | 与\d取反 |
\S | 匹配所有非空格的字符 | 与\s取反 |
^ | 匹配以指定字符开头 | |
$ | 匹配以指定字符结尾 | |
. | 匹配除换行符之外的所有字符 | |
\b | 匹配单词边界 | |
[] | 只要出现在括号中的都可以被匹配 | |
[^] | 只要不出现在括号中的都可以被匹配 | 与[]取反 |
a|b | 或,符合规则a或者规则b的都可以被匹配 | |
() | 分组,表示给几个字符加上量词约束的需求时,就给这些量词分在一个组 |
a|b 元字符规则:
如果a规则是b规则的一部分,且a规则比b规则要苛刻,就把a规则写在前面。
将更复杂\更长的规则放在前面。
3⃣️量词:修饰前面的元字符或者普通字符,限定字符出现的次数
{n} | 量词之前的字符出现n次 |
{n,} | 量词之前的字符至少出现n次 |
{n,m} |
表示这个量词之前的字符出现n-m次 |
? | 匹配量词之前的字符出现0次或一次,表示可有可无 |
+ | 匹配量词之前的字符出现至少1次 或者 多次 |
? |
匹配量词之前的字符出现0次 或者 多次 |
正则表达式的匹配特点:
贪婪匹配(默认):它会在允许的范围内取最长的结果
非贪婪模式/惰性匹配: 在量词后面加?
.*?x 匹配任意非换行符任意长度,知道遇到x就停止
正则在线测试工具 http://tool.chinaz.com/regex/
匹配整数 \d+
匹配小数 \d+\.\d+
匹配小数或整数 \d+\.\d+|\d+ 或\d+(\.\d+)?
匹配身份证号 [1-9]d[16][\dx]|[1-9]\d{14} 或 [1-9]\d[14](\d{2}[\dX])?
Note:关于字符串挪到python中的转义的问题,只需要在工具中测试完毕,确认规则无误后,挪到python中在字符串的外面加上r,r""即可
补充:
零宽断言
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。