day16-正则表达式和面向对象

一、检测类符号

1.\b - 检测是否是单词边界

单词边界:凡是可以将两个单词分开的符号都是单词边界,比如:空白字符、标点符号对应的字符,字符串开头和结尾

注意:检测类符号是在匹配成功的情况下看检测类符号所在的位置是否符合要求

re_str = r'abc \b123'
print(fullmatch(re_str, 'abc 123'))re_str = r'\b\d\d'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)   # ['45', '89', '78']

2.\B - 检测是否不是单词边界

re_str = r'\B\d\d\B'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)   # ['23', '90']

3.^ - 检测是否是字符串开头

re_str = r'^\d\d'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)   # ['99']

4.$ -检测是否是字符串结尾

re_str = r'\d\d$'
result = findall(re_str, '99shj23结合实际 45 计时开始67,数据,89.计算机90l 78')
print(result)   # ['78']

二、匹配次数

三个a:‘aaa’ == ‘a{3}’

三个数字:’\d\d\d’ == ‘\d{3}’

2到5个大写字母: ‘[A-Z]{2,5}’

1.* - 0次或者多次(任意次数)

a* - a出现0次或多次

\d* - \d出现0次或多次,每次的一个\d可以是任意一个数字

[abc]* - [abc]出现0次或多次,每次的[abc]都可以在a、b、c中任意选一个

re_str = r'a\d*b'
print(fullmatch(re_str, 'ab'))
print(fullmatch(re_str, 'a4b'))
print(fullmatch(re_str, 'a67273872b'))
  1. + - 1次或多次(至少一次)

    re_str = r'a\d+b'
    print(fullmatch(re_str, 'ab'))    # None
    print(fullmatch(re_str, 'a4b'))
    print(fullmatch(re_str, 'a67273872b'))
    
  2. ? - 0次或1次

    re_str = r'[+-]?[1-9]\d'
    print(fullmatch(re_str, '16'))
    print(fullmatch(re_str, '-23'))
    print(fullmatch(re_str, '+56'))
    

4.{}

{N} - 匹配N次

{M,N} - 匹配M到N次,M和N都可以取到

{M,} - 匹配至少M次

{,N} - 匹配最多N次

re_str = r'1a{2,5}2'
print(fullmatch(re_str, '1aa2'))
print(fullmatch(re_str, '1aaaaa2'))
print(fullmatch(re_str, '1a2'))      # None

5.贪婪和非贪婪

在匹配次数不确定的时候才有贪婪和非贪婪两种模式
贪婪:在能匹配成功的前提下取匹配次数最多次数。(默认)
非贪婪:在能匹配成功的前提下去匹配次数最少的次数。(在匹配次数后加?)

re_str = r'a.+b'
print(fullmatch(re_str, 'a发阿打算打打234b'))
print(match(re_str, 'asshbljlbddsb给及安达市多'))  # 3次  7次 11次  贪婪模式取11次
# <re.Match object; span=(0, 13), match='asshbljlbddsb'>re_str = r'a.+?b'
print(match(re_str, 'asshbljlbddsb给及安达市多'))  # 3次  7次 11次  非贪婪模式取3次
# <re.Match object; span=(0, 5), match='asshb'>

三、分组和分支

1.分组 - ()

用法1:将正则表达式中的一部分作为一个整体,进行整体相关操作,比如控制次数

用法2:重复-使用\M来重复前面第M个分组中的内容

用法3:捕获

re_str = r'([a-z]{3}\d{2}){3}'
print(fullmatch(re_str, 'asd34fas45fsa54'))# '22a34a44a41'
re_str = r'(\d{2}a){3}\d{2}'
print(fullmatch(re_str, '22a34a44a41'))# '34abc34'、'78abc78'
re_str = r'(\d\d)abc\1'
print(fullmatch(re_str, '12abc12'))
print(fullmatch(re_str, '12abc21'))   # Nonere_str = r'(\d{2})=([\u4e00-\u9fa5])=\2=\1'
print(fullmatch(re_str, '23=王=王=23'))re_str = r'(\d{2})=\1=([\u4e00-\u9fa5])=\2'
print(fullmatch(re_str, '23=23=王=王'))# re_str = r'(\d{2})=\2=([\u4e00-\u9fa5])=\2'
# print(fullmatch(re_str, '23=王=王=王'))   # 报错:

2.分支 - |

正则表达式1|正则表达式2 - 先让正则1和字符进行匹配,如果成功就成功,如果失败就和正则2进行匹配
如果正则2成功结果匹配成功,否则匹配失败(两个正则中只有一个可以匹配成功结果就成功否则失败

# '23abc'、'MKHabc'
re_str = r'\d{2}abc|[A-Z]{3}abc'
print(fullmatch(re_str, '23abc'))re_str = r'(\d{2}|[A-Z]{3})abc'
print(fullmatch(re_str, '23abc'))

3.转义符号

在本身具备特殊功能或者特殊意义的符号前加\,让其功能或者意义消失,表示一个普通符号

re_str = r'[1-9]{2}\.\d{2}'
print(fullmatch(re_str, '19s23'))   # None
print(fullmatch(re_str, '19.23'))re_str = r'\d\+\d'
print(fullmatch(re_str, '2+9'))

注意:独立具备特殊功能的符号在[]中功能会自动消失,例如:+、*、?、.(、)等等

本身在[]中有特殊意义的就要特别注意:^、-、[、]

re_str = r'\d[+]\d'
print(fullmatch(re_str, '2+9'))

四、re模块

1.compile(正则表达式) - 创建一个正则表达式对象

re_obj = re.compile(r'\d{3}')
result = re_obj.fullmatch('123')
print(result)

2.匹配类方法

1)fullmatch(正则表达式,字符串)
正则表达式对象.fullmatch(字符串)
判断整个字符串是否符合正则表达式描述的规则,如果不符合返回None,符合返回匹配对象

2)match
match(正则表达式,字符串)
正则表达式对象.match(字符串)
判断字符开头是否符合正则表达式描述的规则,如果不符合返回None,符合返回匹配对象

result = match(r'((\d{3})-)([a-z]{2,5})', '829-jjs爱仕达大所')
print(result)

1)获取匹配结果

匹配对象.group()/匹配对象.group(0) - 获取整个正则表达式匹配到的结果

匹配对象.group(N) - 获取整个正则表达式中第N个分组匹配到的结果

print(result.group())   # ‘829-jjs’
print(result.group(1))  # '829-'
print(result.group(2))  # '829'
print(result.group(3))  # 'jjs'

2)获取匹配结果在原字符中的位置

匹配对象.span()

匹配对象.span(N)

print(result.span())    # [0, 7)
print(result.span(3))   # [4, 7)

3)获取原字符串

匹配对象.string

print(result.string)    # '829-jjs爱仕达大所'

3.查找类方法

search(正则表达式,字符串)
正则表达式对象.search(字符串) - 获取字符串中第一个满足正则表达式的子串,如果没有返回None,否则返回匹配对象

result = search(r'\d{3}', 'shs23132睡觉觉980hsh-sjjha098')
print(result)

findall(正则表达式,字符串)
正则表达式对象.findall(字符串) - 获取字符串中所有满足正则表达式的子串,以列表的形式返回,列表中的元素是字符串

str1 = 'ss34垃圾袋443kad-232adsd423239'
result = findall(r'\d+', str1)
print(result)   # ['34', '443', '232', '423239']result = findall(r'[\u4e00-\u9fa5]\d+', str1)
print(result)   # ['袋443']

如果正则中有分组,findall只提取匹配结果中分组匹配到的内容

result = findall(r'[\u4e00-\u9fa5](\d+)', str1)
print(result)   # ['443']

如果正则中有多个分组,findall会将每个分组组成一个元组

str2 = '829-jjs爱仕达大所'
result = findall(r'((\d{3})-)([a-z]{2,5})', str2)
print(result)

finditer(正则表达式,字符串)
正则表达式对象.finditer(字符串) - 获取字符串中所有满足正则表达式的子串,返回值是迭代器,迭代器中的元素是匹配对象

str1 = 'ss34垃圾袋443-kad-232-adsd423239'
result = finditer(r'\d+', str1)
print(list(result))result = finditer(r'(\d+)-([a-z]+)', str1)
print('整个正则匹配结果:', [x.group() for x in result])  # 整个正则匹配结果: ['443-kad', '232-adsd']

4.切割

split(正则表达式,字符串)
正则表达式对象.split(字符串) - 将字符串中所有满足正则表达式的子串作为切割点对字符串进行切割

split(正则表达式,字符串,最大切割数)

str1 = '打开2爱斯达克34阿昆达89艾迪康00爱健康打卡88阿昆达'
result = split(r'\d+', str1)
print(result)  # ['打开', '爱斯达克', '阿昆达', '艾迪康', '爱健康打卡', '阿昆达']
str2 = '大家都撒,卡还是打开。阿萨德所,拉时间段里。卡时间段开'
result = split(r'[,。]', str2)
print(result)    # ['大家都撒', '卡还是打开', '阿萨德所', '拉时间段里', '卡时间段开']result = split(r'[,。]', str2, 3)
print(result)    # ['大家都撒', '卡还是打开', '阿萨德所', '拉时间段里。卡时间段开']

5.替换

sub(正则表达式,字符串1,字符串2)
正则表达式对象.sub(字符串1,字符串2) - 将字符串2中所有满足正则表达式的子串都替换成字符串1

result = sub(r'\d+', '+', 'asddas3ad90dada77aj1213')
print(result)   # asddas+ad+dada+aj+result = sub(r'\d+', '+', 'asddas3ad90dada77aj1213', 3)
print(result)  # asddas+ad+dada+aj1213

五、匹配参数

匹配参数:1.单行匹配、2.忽略大小写

1.单行匹配和多行匹配

默认是多行匹配。
多行匹配的时候.不能和\n(换行)匹配;单行匹配的时候,可以和\n匹配

print(fullmatch(r'a.b', 'a\nb'))  # None

单行匹配

print(fullmatch(r'a.b', 'a\nb', flags=S))   # S是从re模块中导入的
print(fullmatch(r'(?s)a.b', 'a\nb'))   # <re.Match object; span=(0, 3), match='a\nb'>

2.忽略大小写

默认不忽略大小写
忽略大小写的时候,大写字母可以和对应的小写字母匹配,小写字母也可以和对应的大写字母匹配

print(fullmatch(r'[a-zA-Z]{3}123', 'Hsm123'))
print(fullmatch(r'[a-z]{3}123', 'Hsm123'))  # None
print(fullmatch(r'[a-z]{3}123', 'Hsm123', flags=I))  # <re.Match object; span=(0, 6), match='Hsm123'>
print(fullmatch(r'(?i)[a-z]{3}123', 'Hsm123'))       # <re.Match object; span=(0, 6), match='Hsm123'>

单行匹配和忽略大小写同时进行

print(fullmatch(r'abc.123', 'ABC\n123', flags=I|S))  # <re.Match object; span=(0, 7), match='ABC\n123'>
print(fullmatch(r'(?is)abc.123', 'ABC\n123'))        # <re.Match object; span=(0, 7), match='ABC\n123'>

六、编程思想

面向过程编程(穷人思想) - 逻辑+算法

函数式编程(小资思想) - 函数

面向对象编程(富豪思想) - 类和对象

1.类和对象

什么是类:具有相同功能和相同属性的对象集合。 - 抽象的概念
什么是对象:对象就是类的实例

day16-正则表达式和面向对象相关推荐

  1. Day16 正则表达式

    Day16 正则表达式 检测类符号 \b - 检测是否是单词边界 单词边界: 凡是可以将两个单词区分开的符号都是单词边界 比如: 空白字符.标点符号对应的字符.字符串的开头和结尾 注意: 检测类符号是 ...

  2. Python Day16 正则表达式【初级】

    Day16 正则表达式 文章目录 Day16 正则表达式 1. 认识正则 2. 匹配类符号 2.1 什么是正则表达式 2.2 python的re模块 2.3 正则语法 - 匹配类符号 3. 匹配次数 ...

  3. day16 正则表达式作业1

    day16 正则表达式作业1 # 1.用户名匹配 """ 要求: 1.用户名只能包含数字 字母 下划线2.不能以数字开头 3.⻓度在 6 到 16 位范围内 " ...

  4. python入门:正则表达式,面向对象编程,零基础视频教程分享

    正则表达式 import re #首先必须import re模块,re=Regular Expression,就是正则表达式的意思. pattern=re.compile(r'hello') #指明你 ...

  5. day16正则表达式枚举类

    正则表达式的概述 正则表达式的概念:使用单个字符串来描述或者匹配一系列符合某种语法规则的字符串 1.通过大量的字符串寻找规律,得出定义规则 2.使用这种规则去匹配新的字符串 3.匹配成功做出相应的操作 ...

  6. Day16(正则表达式,枚举)

    一.正则表达式 package com.shujia.wyh.day16; /*         需求:验证QQ号是否符合         规定         1.必须是5-10位         ...

  7. python 结尾回车_理解不了Python正则表达式?我帮你搞定

    点击蓝字"python教程"关注我们哟! 在学习Python的过程中,我们难免会遇到比较晦涩.难以理解的内容,比如Python中的正则表达式.面向对象等内容,为了更好地帮助大家理解 ...

  8. 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试

    1天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试 https://www.jianshu.com/p/5c1d64e5d724 Json提取器见Day ...

  9. 学习大数据的第19天——正则表达式、枚举类

    学习大数据的第19天--正则表达式.枚举类 package com.shujia.wyh.day16;/*需求:验证QQ号是否符合规定1.必须是5-10位2.0不能作为QQ号的开头3.必须都是数字*/ ...

  10. 这还是你所认知的Python吗?原来是这么牛!

    1994 年末,一群来自美国各地的程序员聚在一起,讨论他们的新式秘密武器. 这是 Python 有史以来的第一次研讨会,有 20 多名开发者参加,Barry Warsaw 是这些与会者当中的一员.他回 ...

最新文章

  1. ASP防SQL注入攻击程序
  2. 每秒处理10万订单乐视集团支付架构--转
  3. 二叉树的存储结构及四种遍历(C语言)
  4. 有关linux用户和用户组管理的知识详解
  5. [CQOI2014]数三角形 题解(找规律乱搞)
  6. matlab 设置为匿名函数,MATLAB匿名函数
  7. 分析称2015年手机文娱将激增至540亿美元
  8. iOS :高德地图SDK配置教程(安装CocoaPods、生成Podfile文件、安装SDK、demo简单使用等)
  9. python画散点图分布-python中画散点图
  10. MIUI系统手机实现WLAN热点桥接
  11. pgsql 后台回复数据
  12. DataTable 服务端模式 进行分页 排序搜索
  13. 原型图是什么?如何画原型图
  14. 新手做独立站需要掌握哪些技能
  15. 嵌入式操作系统VxWorks简介
  16. 解决 Zlibrary 卡死/找不到域名/达到限额问题,Zlibrary最新地址
  17. HTML 复选框元素-复选框(checkbox)
  18. Visual Studio Code | VSCode设置语言
  19. 数字标牌/广告机无线组网方案
  20. BUUCTF:[BSidesCF 2020]Had a bad day

热门文章

  1. 专业之路:13条PS高阶技巧
  2. Excel中部门合并了单元格,销售额如何按部门快速合并单元格求和?
  3. ZEMAX的激光扩束镜的设计优化
  4. 想要毫无PS痕迹,你得用它
  5. Android进阶:手把手教你5G时代Webview的正确使用姿势,完整PDF
  6. iOS多点触摸与手势
  7. 什么样的漏洞买得起北京二环一套房?
  8. 可靠、安全、稳定,开源高质量项目 | 亚马逊的开源文化
  9. python-简易反恐精英
  10. 潜在类别分析之R语言篇