Python进阶之正则表达式
概念
正则表达式是对串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。
⽬的 
给定⼀个正则表达式和另⼀个字符串,我们可以达到如下的⽬的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
符号
正则表达试由⼀些普通和⼀些(metacharacters)组成。普通字符包括⼤⼩写的字母和数字,⽽元字符则具有特殊的含义,我下⾯会给予解释。在最简单的情况下,⼀个正则表达式看上去就是⼀个普通的查串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"testing123"等字符串,但是不能匹配"Testing"。要想真正的⽤好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的⼀个简短的描述。
正则待匹配字符匹配
结果
说明
[0123456789]8True在⼀个字符组⾥枚举合法的所有字符,字符组⾥的任意⼀个字符
和"待匹配字符"相同都视为可以匹配
[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次
这边推荐⼀个验证正则表达式的⼀个⼯具
接下来⼤家可以使⽤上⾯的⼯具来测试下⾯说的实例
实例
[0123456789]---abc123def456只要⼀个字符串中包含数字,都会被匹配到
[a-z] ----abc123def456只要字符串中包含任意⼩写字符,都会被匹配
[A-Z] ----ABC123DEF456只要字符串中包含任意⼤写字符,都会被匹配
[0-9A-Za-z] ----ABCabc123DEF456只要字符串中包含数字⼩写⼤写字母都回匹配
  (匹配以[a-z]开头,以[a-z]结尾的字符串,这⾥只能匹配2个字符的字符串,因为[]代表⼀个字符组)
  (左边匹配了,右边不会再匹配)
组合练习
待匹配字符串正则表达
正则匹配快代理
匹配结果说明
⼩李和⼩王和⼩亮
⼩李和⼩王王和⼩亮亮亮[^和]+
⼩李
⼩王
⼩亮
⼩李
⼩王王
⼩亮亮亮
匹配⾮'和'的所有字符串多次
⼩李和⼩王王和⼩亮亮亮[^和]{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
待匹配字符串正则表达式匹配结果说明
110621************^[1-9]\d{13,16}[0-
9x]$
110621************
可以匹配到⼀个正确的⾝份证,但是如果是16位
1106211990120145也同样能匹配到,但是这并不是⾝份
^[1-9]\d{14}(\d{2}
[0-9x])?$
不会再匹配错误的⾝份证(你可以试试的)
110621************^([1-9]\d{16}[0-9x]|
[1-9]\d{14})$
110621************这个是⽐较好的表达式,先匹配18位,再匹配15位
总结
要想熟练的使⽤正则表达式,还是要多练多写吧!希望⼤家能像计算1+1=2这么简单的使⽤正则表达式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。