1. 正则表达式的应用场景
1.1 重复匹配
- 有时候我们需要对某个字段进行重复匹配,例如手机号码136 6666 6666,一般新手会写成\d\d\d\d\d\d\d\d,这不是一种恰当的表达方式,写着费劲,看着也不舒服,还不一定表达的恰当
- 这种情况下可以使用表达式加上修饰匹配次数的特殊符号 { },不但重复表达式可以匹配,而且看着舒服,例如[abcd][abcd] 可以写成[abcd]{2}
表达式 | 匹配 |
---|---|
{ n } | 重复n次,比如\d{2},相当于\d\d,a{ 3 }相当于aaa |
{ m, n} | 表达式至少重复m次,最多重复n次,比如ab{1,3}相当于ab,abb,abbb这种 |
{m, } | 表达式至少重复m次,没有最多上限次数 |
? | 表达式匹配0或1次,相当于{ 0,1 },比如a[cd]? 可以匹配a,ac,ad |
+ | 至少出现一次,相当于{1,},比如a+b可以匹配ab,aab,aaab |
* | 表达式出现0到任意次,相当于{ 0, } |
1.2 重复匹配和非贪婪匹配
- 位置匹配
有时候我们对匹配的位置有要求,开始,结束,单词之间等
表达式 | 匹配 |
---|---|
^ | 在字符串开始的地方匹配,符号本身不匹配任何字符 |
$ | 在字符结束的位置匹配,符号本身不匹配任何字符 |
\b | 匹配一个单词边界,就是单词之间空格位置,符号本身不匹配任何字符 |
\B | 匹配非单词边界,左右两边都是\w范围或者左右两边都不是\w范围的字缝 |
- 贪婪和非贪婪模式
在重复匹配的时候,表达式总是默认匹配更多字符,这就叫做贪婪模式。例如针对文本dxxxdxxxd,表达式(d)(\w+)(d)中的\w+将匹配第一个\d和最后一个\d之间所有的字符xxxdxxx.可见\w+匹配的时候尽可能多的匹配到了符合条件的字符。同理带有.*?和{m,n}的重复匹配表达式都是尽可能多的匹配
检验数字的匹配表达式
功能 | 表达式 |
---|---|
数字 | ^ [ 0-9 ] *$ |
n位数的数字 | ^ \d{ n } $ |
至少n位的数字 | ^ \d{n, } $ |
零和非零开头的数字 | ^ ( 0 I [1-9] [0-9].*) $ |
有两位小数的正实数 | ^ [ 0-9 ] +( .[ 0-9 ]{2}) ?$ |
非零负实数 | ^-[1-9]\d*$ |
- 特殊场景表达式
功能 | 表达式 |
---|---|
Email地址 | ^\w + ([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$ |
域名 | [ a-zA-Z0-9][-a-zA-Z0-9]{0, 62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0, 62})+/.? |
手机号码 | ^(13 [0-9] I 14 [ 5 I 7 ] I 15 [0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 ] I 18 [ 0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9])\d{8}$ |
身份证号 | ^\d{ 15 } I \d{18}$(15/18位数) |
2. re模块常用方法
方法 | 描述 | 返回值 |
---|---|---|
compile(pattern[,flags]) | 根据包含正则表达式的字符串创建模式对象 | re对象 |
search(pattern, string[, flags]) | 在字符串中查找 | 第一个匹配到的对象或none |
match(pattern, string[,flags]) | 在字符串开始处匹配模式 | 在字符串开头匹配到的对象或none |
split(pattern,string[, maxsplit=0,flags]) | 根据模式的匹配项来分割字符串 | 分割后的字符串列表 |
findall(pattern,string,flags) | 列出字符串中所有模式的匹配项 | 所有匹配到的字符串列表 |
sub(pat,repl,string[],count=0,flags) | 将字符串中所有pat的匹配项用repl替换 | 完成替换后的新字符串 |
- complie(pattern,flags=0)
这个方法是re模块的工厂法,用于将字符串形式的正则表达式编译成Pattern模式对象,可以实现更加效率的匹配。第二个参数flag是匹配模式 使用complie()完成一次转换后,再次使用该匹配模式时不进行转换。经过转换的正则表达式对象也能使用普通的re方法
flag匹配模式
匹配模式 | 描述 |
---|---|
re.A | Ascll 字符模式 |
re.l | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^ and $ |
re.S | 使.通配符匹配包括换行在内的字符,针对多行匹配 |
re.U | 根据Unicode字符集解析字符,这个标识影响\w,\W,\b,\B |
re.X | 更灵活的方式匹配将正则表达式匹配的更加容易理解 |
- search(pattern,string,flags=0)
在文本内查找,返回第一个匹配到的字符串,返回值类型与匹配方法与match()方法一样,区别是查找的位置不固定在文本的开头 - findall(pattern,string,flags=0)
作为re模块的三⼤搜索函数之⼀,findall()和match()、search()的不同之处在于,前两者都是单值匹配,找到⼀个就忽略后⾯,直接返回不再查找了。⽽findall是全⽂查找,它的返回值是⼀个匹配到的字符串的列表。这个列表没有group()⽅法,没有start、end、span,更不是⼀个匹配对象,仅仅是个列表!如果⼀项都没有匹配到那么返回⼀个空列表 - split(pattern, string, maxsplit=0, flags=0)
re模块的split()⽅法和字符串的split()⽅法很相似,都是利⽤特定的字符去分割字符串。但是re模块的split()可以使⽤正则表达式,因此更灵活,更强⼤。split有个参数maxsplit,⽤于指定分割的次数 - sub(pattern, repl, string, count=0, flags=0)
sub()⽅法类似字符串的replace()⽅法,⽤指定的内容替换匹配到的字符,可以指定替换次数
3. 分组功能
- Python的re模块有一个分组功能,就是去已经匹配的内容里再筛选出需要的内容,相当于二次过滤
- 实现分组靠(),获取分组内容靠group()、groups()