19. 正则表达式(二)

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.AAscll 字符模式
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值