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()

19. 正则表达式(二)相关推荐

  1. 剑指 Offer 19. 正则表达式匹配 regex_match() regex()

    一. 题目: 剑指 Offer 19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题 ...

  2. python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配

    面试题19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字 ...

  3. 【LeetCode】剑指 Offer 19. 正则表达式匹配

    [LeetCode]剑指 Offer 19. 正则表达式匹配 文章目录 [LeetCode]剑指 Offer 19. 正则表达式匹配 package offer;public class Soluti ...

  4. 剑指 Offer 19. 正则表达式匹配

    剑指 Offer 19. 正则表达式匹配 https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/ 请实现一个函数用来匹配包 ...

  5. JavaScript 19. 正则表达式

    JavaScript 19. 正则表达式 文章目录 JavaScript 19. 正则表达式 1. 什么是正则表达式 2. 使用字符串方法 2.1 search() 方法 2.2 replace() ...

  6. 【LeetCode笔记】剑指Offer 19. 正则表达式匹配(Java、动态规划)

    文章目录 题目描述 思路 && 代码 二刷 打卡第十二天- 题目描述 拖了超级久的一道题= =,懒得看正则表达式,但是其实和正则表达式相关的地方也不多 思路 && 代码 ...

  7. 剑指offe面试题19——正则表达式匹配

    题目: 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意多次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式.例 ...

  8. 正则表达式二:正则表达式元字符

    二.正则表达式元字符 正则表达式由两种基本字符类型组成:普通文本字符和元字符.元字符使正则表达式具有处理能力.所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元 ...

  9. 剑指offer:面试题19. 正则表达式匹配

    题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹 ...

  10. 大有可为的“正则表达式”(二)

    5.3.  基本和扩展正则表达式 Unix支持两种的正则表达式的版本: (1)现代版本:扩展正则表达式(extended regular expression,ERE),属于IEEE1003.2标准, ...

最新文章

  1. 解决IOS ATS禁止HTTP明文传输
  2. JQuery------各种版本下载
  3. Ant Design Blazor 发布 0.9.0,共100+人贡献!
  4. Perl语言编程学习笔记2
  5. 可视化界面_uniapp通过 HBuilderX 可视化界面构建项目
  6. ASp.net常用服务
  7. PHP中利用Ffmpeg获得flv视频缩略图和播放时间
  8. 莫烦Tensorflow教程(1~14)(转)
  9. 神经网络加速器设计研究:GoSPA ISCA2021论文研读
  10. 从Zachman企业架构框架想到的
  11. 基于pytorch计算ssim和ms-ssim
  12. 计算机数值换算在线,计算机单位换算(计算机单位换算在线)
  13. win10-yolov5环境搭建
  14. 浅谈项目经理的工作职责
  15. vue使用图像编辑器tui-image-editor
  16. 【学习记录-R】以U检验为例解释单/双侧检验
  17. 【 js中通过键盘上下左右移动图片】
  18. 金升阳:研发领跑 以技术推动市场
  19. Makefile 经典教程(看完这篇就够了,不信你拉拉进度条)
  20. 芬兰气象研究所和维萨拉科学测量仪器将用于毅力号火星探测

热门文章

  1. 谷歌浏览器搜索框记录_如何清除您的Google搜索记录
  2. 数据分析之RFM——用户模型分析(附案例数据和代码)
  3. 贴片晶振的焊接方法和注意事项
  4. 在excel中如何筛选重复数据_Excel快速筛选数据方法集锦
  5. CTF--Do you like xml
  6. 证券词汇集锦(中英文+注释版)
  7. 怎样批量修改照片分辨率?
  8. CSS中button标签自带border属性
  9. PDCA循环和GTD时间管理
  10. c语言简易仙侠文字游戏