第一课、初始正则表达式

一、课程介绍

  1.1 课程概要

  步骤介绍

  • 正则表达式入门及应用
  • 正则的进阶
  • 案例
  • 综合项目实战

二、正则表达式的基本操作(多敲代码多做练习)

  2.1 什么是正则表达式

  什么是正则表达式

  • 正则表达式(简称为regex)是一些有字符和特殊符号组成的字符串
  • 能按照某种模式匹配一系列有相似特征的字符串          例如:[a-z]表示26个小写英文字母

  正则表达式中的符号

符号 描述 示例
literal 匹配文本字符串的字面值literal foo
re1|re2 匹配正则表达式re1或者re2 foo|bar
. 匹配任何字符(除了\n之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配0次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配1次或者多次前面出现的正则表达式 [a-z]+\.com
? 匹配0次或者1次前面出现的正则表达式 goo?
{N} 匹配N次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配M~N次前面出现的正则表达式 [0-9]{5,9}
[...] 匹配来自字符集的任意单一字符 [aeiou]
[..x-y..] 匹配x~y范围中的任意单一字符 [0-9][A-Za-z]
[^...] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) [^aeiou],[^A-Za-z0-9]
(*|+|?|{})? 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) *?[a-z]
(...) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3})?,f(oo|u)bar

  正则表达式中的特殊字符

特殊字符 描述 示例
\d 匹配任何十进制数字,与[0-9]一致(\D与\d相反,不匹配任何非数值型的数字)  data\d+.txt
\w 匹配任何字母数字字符,与[A-Za-z0-9]相同(\W与之相反)  [A-Za-z_]\w+
\s 匹配任何空格字符,与[\n\t\r\v\f]相同(\S与之相反)  of\sthe
\b 匹配任何单词边界(\B与之相反)  \bThe\b
\N 匹配已保存的子组N(参见上面的(...))  price:\16
\c 逐字匹配任何特殊字符c(即,仅按照字面意义匹配,不匹配特殊含义)  \.,\\,\*
\A(\Z) 匹配字符串的起始(结束)(另见上面介绍的^和$) \ADear

  正则表达式中的扩展表示法

扩展表示法 描述 示例
(?iLmsux) 在正则表达式中嵌入一个或者多个特殊"标记"参数(或者通过函数/方法) (?x),(?im)
(?:…) 表示一个匹配不用保存的分组 (?:\w+\.)*
(?P<name>…) 像一个仅由name标识而不是数字ID标识的正则分组匹配 (?P<data>)
(?P=name) 在同一字符串中匹配由(?P<name)分组的之前文本 (?P=data)
(?#…) 表示注释,所有内容都被忽略 (?#comment)
(?=…) 匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 (?=.com)
(?!…) 匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 (?!.net)
(?<=…) 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 (?<=800-)
(?<!…) 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 (?<!192\.168\.)
(?(id/name)Y|N) 如果分组所提供的id或name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N;|N是可选项 (?(1)y|x)

  使用正则表达式

  • 简单匹配:例如:abc=>abc
  • 多个匹配模式:例如:abc|12c=>abc,12c
  • 匹配任意字符(.),除\n之外:例如:.=>abc.12c

  2.2 正则表达式的使用

  使用正则表达式

  • *匹配0次或者多次
  • +匹配一次或者多次
  • ?匹配0次或者一次
  • {N}匹配指定的N次
  • {M,N}匹配M-N次,最大化优先

  2.3 正则表达式匹配同类型及边界匹配

  匹配同类型

  • \d匹配数字
  • \w匹配数字和字母
  • \s匹配任何空格字符

  边界匹配

  • 用^匹配以**开头
  • 用$匹配以**结尾

  2.4 正则表达式匹配选项

  匹配特殊字符

  • 需要用“\”进行转义
  • 使用[]指定要匹配的集合
  • 使用[^]指定不要匹配的内容

  2.5 正则表达式分组

  正则表达式分组

  • 重复一个字符串时
  • 使用()进行分组,使用(?<word>\w+)指定组名
  • 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
  • 使用()对匹配的内容分组
  • 使用\1、\2反向引用

  2.6 贪婪模式vs非贪婪模式

  贪婪模式vs非贪婪模式

  • 贪婪匹配

    • 在整个表达式匹配成功的前提下,尽可能多的匹配
  • 非贪婪匹配
    • 在整个表达式匹配成功的前提下,以最少的匹配字符
  • 默认是贪婪模式

  

  • 贪婪模式举例

    • 表达式ab.+c

      测试数据:abacaxcd

      匹配结果:abacaxc

  • 非贪婪模式

    • 只需要在匹配pattern中加上“?”
    • 表达式ab.*?c

      测试数据:abacaxcd

      匹配结果:abac

三、 实战:正则表达式的应用

  实战:身份证号码的正则匹配

  正则表达式联系

  • 身份证号码匹配正则表达式编写
  • 电子邮箱正则表达式

四、 正则表达式进阶

  4.1 正则的进阶介绍

  课程概要

  • re模块
  • findall()的使用
  • search()的使用
  • group()与groups()的使用
  • split()正则分割
  • Sub()正则替换

  课程目标

  • 掌握compile()和match()函数的使用
  • 掌握findall()和search()函数的使用
  • math()和search()的区别
  • 掌握group()、groups()、groupdict()的基本使用
  • 掌握split()、sub()的基本使用

  教学思路

  • 先理论
  • 后代码实战
  • 跟着来

  4.2 re模块介绍

  re模块

属性 描述
re.I、re.IGNORECASE 不区分大小写的匹配
re.L、re.LOCALE 根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S实现匹配
re.M、re.MULTILINE ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾
re.S、re.DOTALL “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示“.”(点号)能够匹配全部字符
re.X、re.VERBOSE 通过反斜杠转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且提高可读性

  re模块-compile

  • compile(pattern,flag = 0)
  • 使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
  • 推荐编译,但它不是必须的

  re模块-match

  • match(pattern,string,flag = 0)
  • 尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回匹配对象;如果失败,就返回None
 1 import re
2
3 # 将正则表达式编译
4 pattern = re.compile(r'hello', re.I)
5 print(dir(pattern))
6
7 # 通过match进行匹配
8 rest = pattern.match('Hello,world')
9 print(rest)
10 print(dir(rest))
11 print('string', rest.string)
12 print('re:', rest.re)
13 print(rest.groups())

  4.3 findall和search

  findall()的使用

  • findall(pattern,string[,flags])
  • 查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表
 1 import re
2
3 # 找出一下字符串中的数字
4
5 content = 'One1Two22three333four4444five55555six666666'
6
7 # 使用编译的对象
8 p = re.compile(r'[a-z]+', re.I)
9 rest = p.findall(content)
10 print(rest)
11
12 # 不编译
13 all_rest = re.findall(r'[a-z]+', content, re.I)
14 print(all_rest)

  search()的使用

  • search(pattern,string, flags = 0)
  • 使用可选标记搜索字符串中第一次出现的正则表达式模式。如果匹配成功,则返回匹配对象;如果失败,则返回None
 1 import re
2
3 # 找出一下字符串中的数字
4
5 content = 'hello, world'
6
7 # 使用编译的对象
8 p = re.compile(r'world')
9 # 使用search
10 rest = p.search(content)
11 print(rest)
12
13 # 使用match
14 rest_match = p.match(content)
15 print(rest_match)
16
17 # 使用函数进行调研
18 rest_func = re.search(r'world', content)
19 print(rest_func)

  4.4 正则表达式的分组(group()与groups())

  group()与groups()的使用

  • group(num)返回整个匹配对象或编号为num的特定子组
  • groups():返回一个包含所有匹配子组的元组(如果没有成功匹配,则返回一个空组)
 1 import re
2
3 def test_group():
4 content = 'hello, world'
5 p=re.compile(r'world')
6 rest = p.search(content)
7 print(rest)
8 if rest:
9 # group的使用
10 print(rest.group())
11 # groups的使用
12 print(rest.groups())
13
14
15
16 def test_id_card():
17 """身份证号码正则匹配"""
18 # p = re.compile(r'(\d{6})(\d{4})((\d{2})(\d{2}))(\d{2}\d{1})([0-9]|X)')
19 p = re.compile(r'(\d{6})(?P<year>\d{4})((?P<mouth>\d{2})(?P<day>\d{2}))(\d{2}\d{1})([0-9]|X)')
20 # 准备两个身份证号
21 id ='230381199310070329'
22 rest1 = p.search(id)
23 print(rest1.group(2))
24 print(rest1.groups())
25 print(rest1.groupdict())
26
27 if __name__ == '__main__':
28 #test_group()
29 test_id_card()

  4.5 正则表达式的分割和替换

  split()正则分割

  • split(pattern, string, max=0)
  • 根据正则表达式的模式分隔符,split函数将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次(默认分割所有匹配成功的位置)
 1 import re
2
3 """
4 使用split正则分割字符串
5 """
6
7 s = 'one1two2three3four4five5six6'
8 p = re.compile(r'\d+')
9 rest = p.split(s, 2)
10 print(rest)

  sub()正则替换

  • sub(pattern,repl,string,max=0)
  • 使用repl替换string中每一个匹配的子串后返回替换后的字符串,最多操作max次(默认替换所有)
 1 import re
2
3 """
4 使用正则表达式进行替换
5 """
6 s = 'one1two2three3four4five5six6'
7 # one@two@three@four@five@six@
8
9 #使用正则替换
10 p = re.compile(r'\d+')
11 rest = p.sub('@', s)
12 print(rest)
13
14 # 使用字符串原始替换方式
15 rest_origin = s.replace('1', '@').replace('2', '@').replace('3', '@').replace('4', '@').replace('5', '@').replace('6', '@')
16 print(rest_origin)
17
18 s2 = 'hello world'
19 # 使用正则表达式
20 p2 = re.compile(r'(\w+) (\w+)')
21 rest_pos = p2.sub(r'\2 \1', s2)
22 print(rest_pos)
23
24
25 # 在原有的内容基础上,替换并改变内容
26 def f(m):
27 """使用函数进行替换规则改变"""
28 return m.group(2).upper() + ' ' + m.group(1)
29
30
31 rest_change = p2.sub(f, s2)
32 print(rest_change)
33
34
35 # 使用匿名函数进行替换 lambda
36 rest_lamb = p2.sub(lambda m: m.group(2).upper() + ' ' + m.group(1), s2)
37 print('--------')
38 print(rest_lamb)

五、 正则综合实战(多练多看)

  5.1 实战:正则匹配图片地址的需求分析

# 1. 下载html
# 2. 写正则的规则
# 要找到img标签
# 找到src属性
# <img class="" style="" src="xxx" xx="">
# <img.+src=\".+\".+>

  5.2 实战:代码实现正则匹配图片地址

 1 import re
2
3 def test_re_img():
4 """ 使用正则表达式找到图片的地址 """
5 # 1.读取html
6 with open('img.html', encoding='utf-8') as f:
7 html = f.read()
8 # print(html)
9 # 2. 准备正则
10 p = re.compile(r'<img.+?src=\"(?P<src>.+?)\".+?>', re.I)
11 # 使用findall找到图片的列表
12 list_img = p.findall(html)
13 print(len(list_img))
14 for ls in list_img:
15 print(ls.replace('&amp;', '&'))
16 #TODO 使用urllib,requests将图片保存
17
18
19
20 if __name__ == '__main__':
21 test_re_img()

六、 课程总结

  课程总结

  • 什么是正则表达式
  • 正则表达式匹配N次
  • 匹配同类型及边界匹配
  • 正则表达式匹配选项
  • 正则表达式分组
  • 贪婪模式VS非贪婪模式
  • 正则表达式分析练习

  知识点回顾

  • 什么是正则表达式

    • 正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串
    • 能按照某种模式匹配一系列有相似特征的字符串
      • 例如:[a-z]表示26个小写字母
  • 使用正则表达式
    • 简单匹配:例如:abc => abc
    • 多个匹配模式:例如:abc|12c =>abc,12c
    • 匹配任意字符(.),除\n之外:例如:. => abc, 12c
    • *匹配0次或者多次
    • +匹配一次或者多次
    • ?匹配0次或者1次
    • {N}匹配指定的N次
    • {M-N}匹配M-N次,最大化优先
    • 匹配同类型
      • \d匹配数字
      • \w匹配数字和字母
      • \s匹配任何空格字符
    • 边界匹配
      • 用^匹配以**开头
      • 用$匹配以**结尾
    • 匹配特殊字符
      • 需要用“\”进行转义
    • 指定匹配选项
      • 使用[]指定要匹配的集合
      • 使用[^]指定不要匹配的内容
  • 正则表达式分组
    • 重复一个字符串时
    • 使用()进行分组,使用(?<word>\w+)指定组名
    • 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
    • 使用()对匹配的内容分组
    • 使用\1、\2反向引用
  • 贪婪模式VS非贪婪模式
    • 贪婪模式

      • 在整个表达式匹配成功的前提下,尽可能多的匹配
    • 非贪婪模式
      • 在整个表达式匹配成功的前提下,以最少的匹配字符
      • 只需在匹配pattern中加上“?”
      • 表达式ab.*?c
        • 测试数据:abacaxcd
        • 匹配数据:abac
    • 默认是贪婪模式
  • 正则表达式练习
    • 身份证号码匹配正则表达式编写
    • 电子邮箱正则表达式编写
    • 手机号码正则表达式编写

  重点知识

  • 理解什么是正则表达式以及它的用途
  • 正则表达式的基本语法
  • 正则表达式的编写和验证
  • 正则表达式的分组及反向引用

  难点知识

  • 正则表达式的贪婪与非贪婪模式
  • 正则表达式的分析方法

【python】第一模块 步骤四 第一课、初始正则表达式的更多相关文章

  1. 我的python中级班学习之路(全程笔记第一模块) (第一章)(第2部分:如何设置python中的字体颜色,猜年龄练习题解答,while else语句,pycharm的使用)

    第一章:  python 基础语法 第  2  部分: 一.猜年龄练习题解答 直接上代码 >>> age = 26 >>> count = 0 >>&g ...

  2. python 安装模块步骤

    1.下载 pyocr-0.4.1.tar.gz   tar.gz文件  解压  放到 c:/python27 文件夹下面 C:\Python27\pyocr-0.4.1  直接 cmd 命令 进入   ...

  3. python基础-------模块与包(三)正则表达式

    re模块正则表达式 正则表达式常用符号: [ re模块使用方法]: match(string[, pos[, endpos]]) | re.match(pattern, string[, flags] ...

  4. 【Linux探索之旅】第一部分第四课:磁盘分区,并完成Ubuntu安装

    内容简介 1.第一部分第四课:磁盘分区,并完成Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区 上一课我们正式开始安装Ubuntu了,但是到了分区的那一步,小编却戛然 ...

  5. C语言探索之旅】 第一部分第四课第三章:变量的世界之显示变量内容

    内容简介 1.课程大纲 2.第一部分第四课第三章:变量的世界之显示变量内容 3.第一部分第五课预告:基本运算 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用 ...

  6. 【C语言探索之旅】 第一部分第四课第二章:变量的世界之变量声明

    内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布 ...

  7. 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4

    孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  8. 【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事

    内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答 ...

  9. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

  10. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

随机推荐

  1. revit卸载工具,完全彻底卸载删除干净revit各种残留注册表和文件的方法和步骤。

    revit卸载工具,完全彻底卸载删除干净revit各种残留注册表和文件的方法和步骤.如何卸载revit呢?有很多同学想把revit卸载后重新安装,但是发现revit安装到一半就失败了或者显示revit ...

  2. 对qa 工作的理解

    主要职责 进行检查,包括组织级和项目级工作内容,其中组织级和项目级里包括[过程]和[资产]两项内容. 跟进不符合项,和项目经理等干系人沟通,直到不符合项问题得到解决 识别过程改进的内容,反馈给EPG. ...

  3. wpf 自定义Messagebox时,对话框显示不居中问题

    在自定义Messagebox(有属性Window.SizeToContent="WidthAndHeight")时,对话框显示不居中,经过尝试,应设置如下: msgBox.Wind ...

  4. SY有了不适症状吃抗过敏药试试

    有了不适症状吃抗过敏药试试 Therapy for the eyes Providing welcome relief from the effects of daily stresses on th ...

  5. PowerShell学习笔记一_cmdlet、管道、如何入门

    PowerShell文件: .ps1 脚本文件 .psm1 模块文件 .psd1 模块描述文件 cmdlet(命令行) 组成: 动词-名词,例如: 1. Get-Service(获取所有服务),类似于 ...

  6. mysql添加到环境变量

    今天换新系统,以前的一些常用软件重新安装了一下,安装到mysql我还是按照以前的习惯选择了低版本的5.7系列,突然想要装一把,像python一样可以直接访问解释器,能不能直接在cmd中输入mysql就 ...

  7. eclipse (4.10.0)安装sts

    1.离线安装 下载对应版本 https://spring.io/tools3/sts/all 打开Eclipse,点击help下的install new software,选择Add..,再点击Arc ...

  8. 使用@RequestBody注解接收的实体类中的某些参数为null

    原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...

  9. Vmware workstation虚拟机导入到esxi虚拟机

    VMware Workstation 与 ESXi 的主要区别 VMware Workstation是直接在windows系统下安装软件,安装后再在软件里面安装虚拟机,而ESXi相当于一个linux操 ...

  10. 跨时钟域之异步FIFO

    参考:https://www.cnblogs.com/aslmer/p/6114216.html 文章:Simulation and Synthesis Techniques for Asynchro ...