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

news/2024/11/30 9:45:40/

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.类和对象

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


http://www.ppmy.cn/news/234415.html

相关文章

C语言整型提升、算术转换、操作符的属性

C语言整型提升、算术转换、操作符的属性 整型提升 C语言在进行整型算术运算时&#xff0c;总是把字符型、短整型操作数在使用之前转换为普通整型参与运算。   整型提升是按照数据类型的符号位来提升的&#xff0c;正数补0&#xff0c;负数补1。如果是无符号的数&#xff0c;高…

【Matlab风电功率预测】麻雀算法优化BP神经网络风电功率预测【含源码 1319期】

一、代码运行视频&#xff08;哔哩哔哩&#xff09; 【Matlab风电功率预测】麻雀算法优化BP神经网络风电功率预测【含源码 1319期】 二、matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]张启龙,王立威.基于遗传算法优化BP神经网络模型的风电功率预测[J]. 电子测试…

用matlab画效率图时,如何让去除外特性以外部分的等高线?

最近在做汽车能量管理的相关项目&#xff0c;需要将发动机&电机的工作点在map图上表示出来&#xff0c;peace of cake&#xff0c;在拿到工作点的数据以及发动机油耗数据&电机效率数据以后&#xff0c;我很快将他们处理出来&#xff0c;于是得到下面的图&#xff1a; &…

【SVM分类】基于支持向量机实现电力节点分类附matlab代码

1 简介 2 部分代码 function mpc = case39 %CASE39 Power flow data for 39 bus New England system. % Please see CASEFORMAT for details on the case file format. % Data taken from [1] with the following modifications/additions: % % - renumbered gen bu…

tpx色卡电子版_潘通色卡电子版Pantone TPX(新175色)

页数色号颜色颜色名称 N0115-3800TPXPorpoise N0116-3800TPXSatelliet N0118-1210TPXDriftwood N0118-1304TPXFalcon N0119-0808TPXMorel N0118-1108TPXFallen Rock N0116-0205TPXVintage Khaki N0216-1104TPXCrockery N0216-1109TPXGreige N0217-1311TPXDesert Taupe N0215-13…

单片机蜂鸣器的控制程序与驱动电路图

蜂鸣器从结构区分分为压电式蜂鸣器和电磁式蜂鸣器。压电式为压电陶瓷片发音&#xff0c;电流比较小一些&#xff0c;电磁式蜂鸣器为线圈通电震动发音&#xff0c;体积比较小。按照驱动方式分为有源蜂鸣器和无源蜂鸣器。这里的有源和无源不是指电源&#xff0c;而是振荡源。有源…

Linux 系统Candy

0.GDB调试技巧 GDB 反编译内存,没有符号信息的情况下,有x指令和disas 指令两种方式: Linux idle task callstack POSION头文件: linux的异常表是在哪里建立的? 首先在连接脚本中的符号__vectors_start: 然后,在将vectors的内存映射到0XFFFF0000 ARM向量地址:

图神经网络实战案例-新冠疫苗项目实战,助力疫情!

Kaggle新冠疫苗研发竞赛 https://www.kaggle.com/c/stanford-covid-vaccine/overview mRNA疫苗已经成为2019冠状病毒最快的候选疫苗&#xff0c;但目前它们面临着关键的潜在限制。目前最大的挑战之一是如何设计超稳定的RNA分子(mRNA)。传统疫苗是装在注射器里通过冷藏运输到世界…