Python程序设计基础教程课件 第11章 正则表达式_第1页
Python程序设计基础教程课件 第11章 正则表达式_第2页
Python程序设计基础教程课件 第11章 正则表达式_第3页
Python程序设计基础教程课件 第11章 正则表达式_第4页
Python程序设计基础教程课件 第11章 正则表达式_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计基础教程

第11章正则表达式提纲正则表达式能做什么正则表达式的定义在Python中进行演练正则表达式语法规则进阶用法在Python中使用re模块函数正则表达式对象学习目标了解正则表达式的特点和适用场景掌握正则表达式语法规则掌握在python中使用正则表达式1正则表达式能做什么正则表达式能做什么"2114student1@","2243student2@","2079student3@""2114student1@m.","2243student2@m.","2079student3@"多种方案文本查找和替换可以,但是需要罗列年份信息转换成整数后比较(X<21)使用正则表达式查找和替换2正则表达式的定义正则表达式正则表达式(英语:Regularexpression,常简写为regex、regexp或RE),又称规律表达式、正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一种工具。通过约定好的语法规则,可以定义一个模式,用来查找、替换或格式化特定格式的字符串。例如:描述电子邮件地址规则的正则表达式^((?!\.)[\w-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$正则表达式各类编程语言都对正则表达式的支持这些语言中的正则表达式支持不仅限于基本的匹配和搜索,还包括更复杂的模式匹配、后向引用、断言和其他高级功能。不同语言实现的正则表达式虽然基本相似,但在细节上可能有所不同。因此,在通过不同的语言使用正则表达式前,需要查阅特定语言的相关文档。文本编辑器都支持使用正则表达式课程中使用的集成开发环境,如VisualStudioCode,PyCharm等,文本编辑器如NodePad++等,MicrosoftWord和WPSOffice等文字处理软件正则表达式掌握正则表达式的使用能够在文档处理时大大提高效率。简化复杂的文本模式识别和编辑,可以在短时间内完成大量重复性的编辑任务。无论是在软件开发、数据分析还是日常的文档编辑中,正则表达式都是一个强大且灵活的工具,掌握它将对你的工作和学习产生深远的影响。在Python中练习首先需要导入Python的re模块这个模块包含了所有与正则表达式相关的功能和方法。>>>importre>>>re.search('fud','fudanuniveristy')<re.Matchobject;span=(0,3),match='fud'>练习用的方法方法说明search(pattern,string[,flags])在字符串中寻找模式若匹配,返回Match对象,否则返回Nonematch(pattern,string[,flags])从字符串的开始处匹配模式若匹配,返回Match对象,否则返回Nonefindall(pattern,string[,flags])列出字符串中模式的所有匹配项返回匹配结果列表,若pattern含有组(子模式),同时返回组的列表练习用的方法-Match对象Match对象的更详细内容:group()方法返回由正则表达式匹配的字符串。例如:字符串text="Hello,mynumberis123-456-7890",正则表达式pattern=r'\d{3}-\d{3}-\d{4}'。执行match=re.search(pattern,text)后,match.group()将返回'123-456-7890',即匹配的电话号码。start()和end()方法分别返回匹配字符串的起始和结束位置索引。例如:在上述示例中,match.start()将返回匹配字符串开始的索引,而match.end()将返回结束索引。groups()方法返回一个包含所有小组匹配字符串的元组。例如:正则表达式为pattern=r'(\d{3})-(\d{3})-(\d{4})',match.groups()将返回一个元组('123','456','7890')。3正则表达式语法规则语法规则正则表达式遵循基本的语法规则,包括元字符定义元字符规则(如字符、预定义字符、边界、重复、分组和选择等)构成。表达式:由各类元字符、转义字符(‘\’)和普通字符依照规则组合而成元字符转义是通过在元字符前面添加反斜杠\来实现的,这样做将取消元字符的特殊功能,使之被解释为普通字符。例如,虽然.在正则表达式中用来匹配任何单个字符,但\.则专门用来匹配实际的点号字符。元字符是正则表达式中具有特殊意义的字符,如下图所示元字符规则以下是不同分类的元字符规则分类描述字符类用于指定一组字符,如[abc]匹配a、b或c。预定义字符类匹配常见类型的字符,如\d(数字)、\w(字母数字)、\s(空白字符)。重复限定符指定前面元素出现的次数,如*(零次或多次)、+(一次或多次)、?(零次或一次)、{n}(指定次数)。边界匹配符用于匹配单词或字符串的边界,如^(行首)、$(行尾)、\b(单词边界)。分组符()用于创建子表达式或捕获组,控制量词作用范围,创建后向引用。选择符|用于表示“或”关系,它允许匹配多个可选项中的一个。例如,a|b匹配a或b。表达式表达式即由各类元字符、转义字符(‘\’)和普通字符依照规则组合而成例一:希望从英文小说中查找hi,但不能把him,high,history也找到时表达式例二:要找后面不远处跟着一个Lucy的hi字符类字符类在正则表达式中是通过使用方括号[]来创建的,它代表一个可选字符的集合,其中的任何一个字符都可以匹配。请注意:尽管这个集合可以包含多个字符,在不指明数量时(参见量词小节),匹配的结果始终只是集合中的单个字符。在[]中可以使用连字符-和否定符^。连字符表示ASCII代码表中,从开始字符到结束字符范围内的所有字符;否定符仅能在第一个位置起作用,表示集合中的字符均被排除。字符类类别表达式描述基本字符集合[abc]匹配a、b或c中的任何一个字符。

[xyz]匹配x、y或z。范围字符类[a-z]匹配任何小写字母。

[A-Z]匹配任何大写字母。

[0-9]匹配任何数字。

[a-zA-Z]匹配任何字母,不论大小写。组合字符类[abc123]匹配a、b、c、1、2或3。

[A-Za-z0-9]匹配任何字母数字字符。

[A-Za-z0-9\-_]如果要把连字符包含在内,需要使用转义否定字符类[^abc]匹配任何不是a、b或c的字符。请注意:^只在第一个位置起作用

[^0-9]匹配任何非数字字符。预定义字符类匹配任意字符:使用.来匹配任意单个字符(除了换行符)。转义特殊字符:使用\转义特殊字符,如\.匹配字面上的点号。匹配数字或字母:使用\d匹配数字,相当于[0-9];使用\D匹配非数字字符字,相当于[^0-9];使用\w匹配字母数字或下划线,相当于[a-zA-Z0-9_];\W与\w含义相反,匹配非单词字符;匹配任何空白字符:使用\s,相当于[\t\n\r\f\v[此处为一个空格]];\S与\s含义相反,匹配非空白类字符,相当于[^\t\n\r\f\v4]重复限定符重复限定符包括*,+,?,{n},{n,},{n,m},用于指定重复的次数。{n,m}:重复n到m次。例如:o{1,3}匹配”fooooood”中的前3个”o”和后3个”o”,即['ooo','ooo']。{n,}:至少重复n次。例如:“o{2,}”匹配“fooooood”中的所有的“o”,不匹配“bob”中的“o”。匹配指定次数:使用{n}匹配一个字符恰好n次。例如:\b[0-9]{3}匹配”000”、”001”至”999”,o{2}匹配”food”中的”oo”,但不匹配”bob”中的”o”。重复限定符匹配零次或多次:使用*匹配一个字符零次或多次。匹配一次或多次:使用+匹配一个字符至少一次。匹配零次或一次:使用?匹配一个字符一次或零次。例如,a*匹配包括空字符串在内的任意数量的连续字母a,a+匹配一个或多个a,而a?匹配零个或一个a。贪婪性匹配针对重复限定符,Python默认采用贪婪性匹配算法。尽可能多地匹配要重复的前导字符,只有当这种重复引起整个正则表达式匹配失败的情况下,才会进行回溯。可以在限定符后面加后缀?,要求正则表达式引擎使用懒惰性匹配算法。依照懒惰性匹配算法,正则表达式引擎尽可能少地重复前导字符符号说明*?重复任意次,但尽可能少重复+?重复1次或更多次,但尽可能少重复??重复0次或1次,但尽可能少重复{n,m}?重复n到m次,但尽可能少重复{n,}?重复n次以上,但尽可能少重复边界匹配符边界匹配符用于指定字符串中的特定位置。^匹配字符串的开始$匹配字符串的结束\b匹配单词边界\B匹配非单词边界边界匹配符仅匹配字符串的位置,不会消耗模式中的字符,因此又称为0宽度边界匹配符。^a匹配以字母a开始的字符串,a$匹配以字母a结束的字符串,而\ba\b匹配作为独立单词的a。\bfoo\b匹配”foo”,”foo.”,”(foo)”,”barfoobaz”。但不匹配”foobar”,”foo3”。正则表达式进阶分组正则表达式使用圆括号()标记“分组(子模式)”,将正则表达式的一部分组合在一起,以便可以作为一个单独的单元处理分组(子模式)可以嵌套,计算结果将返回整体分组和各个分组。每个分组有一个编号,按照从左到右的左括号的顺序从1开始进行编号;编号0表示整个匹配的模式。match对象的分组match对象,可以通过group和groups函数来获得匹配的分组通过span、start、end等函数获得group匹配的位置。传递的参数可以是单个组编号,也可以是多个组编号(返回包含各组内容的tuple)。如果不传递参数,缺省为group0。match.group(0)match.groups()findall方法如果pattern没有包含分组时,以列表的形式返回匹配项;如果pattern含有分组,则仅包含分组的匹配结果;如果有多个分组,则匹配结果以tuple形式描述。>>>importre>>>pattern=r'\d+'#无分组>>>re.findall(pattern,"Mynumbersare123,456,and7890")['123','456','7890']>>>pattern=r'(\d{3})-\d{4}'#一个分组>>>re.findall(pattern,"Callmeat123-4567or987-6543")['123','987']>>>pattern=r'(\d{3})-(\d{4})'#多个分组>>>re.findall(pattern,"Callmeat123-4567or987-6543")[('123','4567'),('987','6543')]不关心某个组可以通过在(后面添加?:表示对该分组匹配的内容不感兴趣,该组也不占用组编号例如:re.search(r'(?:([\d]{2})-)?([\d]{2,3})-([\d]{7,8})','Tel:21-65642222,')。给分组命名在(后面添加?P<groupname>match对象的group,span,start,end等函数可以通过组名来访问例如:r'((?P<country>[\d]{2})-)?(?P<city>[\d]{2,3})-(?P<phone>[\d]{7,8})'引用(不考察)分组还支持引用(backreference),使用\N表示引用前面的编号为N的分组匹配的内容。这种模式只能引用前面已经匹配的编号,不能引用后面的分组的编号,也不能引用编号0。>>>importre>>>pattern=r'((\b\w+)\s+\2)'#匹配两个连续的重复单词>>>print(re.findall(pattern,'Parisinthethespring'))[('thethe','the')]>>>pattern=r'(?P<word>\b\w+)\s+(?P=word)'#匹配两个连续的重复单词>>>print(re.search(pattern,'Parisinthethespring'))<re.Matchobject;span=(9,16),match='thethe'>选择选择符|,用于选择匹配多个可能的模式中的一个,它的优先级最低,如需要可使用()来限制选择符的作用范围。>>>importre>>>re.findall(r'((0\d{2}|0\d{3})-(\d{8}|\d{6}))','复旦大学总江大)[(,'021','65642222'),(,'0571','87951111')]在Python中使用正则表达式2种方式直接使用模块函数(re)编译正则表达式对象直接使用模块函数(re)-查找方法说明search(pattern,string[,flags])在字符串中寻找模式若匹配,返回Match对象,否则返回Nonematch(pattern,string[,flags])从字符串的开始处匹配模式若匹配,返回Match对象,否则返回Nonefindall(pattern,string[,flags])列出字符串中模式的所有匹配项返回匹配结果列表,若pattern含有组(子模式),同时返回组的列表finditer(pattern,string[,flags])返回一个迭代器,每次返回匹配的下一个match对象分割/替换方法说明split(pattern,string[,maxsplit=0])根据模式匹配项(匹配分割符)分割字符串,返回分割后的字符串列表,maxsplit为分割的最大次数sub(pat,repl,string[,count=0])将字符串中所有pat的匹配项用repl替换;并返回替换后的字符串,count为替换的最大次数替换成的字符串replace可以包含组的引用,表示该分组匹配的内容subn(pat,repl,string[,count=0])将字符串中所有pat的匹配项用repl替换;并返回元组:(替换后的字符串,替换次数),count为替换的最大次数示例1:importre

match=re.search('fo','Thequickbrownfoxjumpedforfood')print(match)#<_sre.SRE_Matchobject;span=(16,18),match='fo'>

print('pattern==>%s\nfound==>%s'%(match.re.pattern,match.group()))print(match.string[match.start():match.end()])示例2:importre

match1=re.findall(r'(([\d]{2})-)?([\d]{2,3})-([\d]{7,8})','Tel:86-21-65642222,Tel:76-31-65642244,')print(match1)

match2=re.search(r'(([\d]{2})-)?([\d]{2,3})-([\d]{7,8})','Tel:86-21-65642222,Tel:76-31-65642244,')print(match2)print(match2.groups())print(match2.group())print(match2.group(1,2,3,4))示例3:importrematch3=re.finditer(r'(([\d]{2})-)?([\d]{2,3})-([\d]{7,8})','Tel:86-21-65642222,Tel:76-31-65642244,')forindex,matchinenumerate(match3,1):#match3是迭代器 print('%d:[%d,%d)==>%s'%(index,match.start(),match.end(),match.group()))正则表达式对象使用re模块的compile()方法可以将正则表达式编译生成正则表达式对象,然后再使用正则表达式对象提供的方法,在需要多次使用正则表达式时,建议使用编译模式。importreregex

=

pile(pattern[,flags])#编译生成正则表达式正则表达式对象方法正则表达式对象的方法允许传递参数pos和endpos,指明搜索开始和结束位置方法说明regex.search(string[,pos[,endpos]])在整个字符串或指定范围搜索;若匹配返回Match对象,否则返回Noneregex.match(string[,pos[,endpos]])与search类似,只是要求模式出现在字符串开头或指定位置开头regex.findall(string[,pos[,endpos]])在字符串中查找与模式匹配的字符串,返回匹配结果列表。若pattern含有组,则仅返回包含子模式的匹配结果,如果有多个子模式,则匹配结果以tuple形式描述regex.finditer(string[,pos[,endpos]])返回一个在整个字符串或指定范围搜索的迭代器,每次返回匹配的下一个match对象regex.sub(repl,string[,count=0])将字符串中所有pattern的匹配项用repl替换;并返回替换后的字符串,count为替换的最大次数regex.subn(repl,string[,count=0])将字符串中所有pat的匹配项用repl替换,并返回元组:(替换后的字符串,替换次数),count为替换的最大次数regex.split(string[,maxsplit=0])根据模式匹配项(匹配分割符)分割字符串,返回分割后的字符串列表,maxsplit为分割的最大次数例子importretelNumber='''SupposemyPhoneNo.iyoursihisi'''pattern=pile(r'(\d{3,4})-(\d{7,8})')index=0whileTrue:matchResult=pattern.search(telNumber,index)ifnotmatchResult:breakprint('-'*30)print('Success:')foriinrange(3):print('Searchedcontent:',matchResult.group(i),\'Startfrom:',matchResult.start(i),'Endat:',matchResult.end(i),\'Itsspanis:',matchResult.span(i))index=matchResult.end(2)#orend()匹配结果对象(MatchObject)方法/属性描述group()返回整个匹配结果。如果正则表达式中包含了分组,group(0)或group()将返回整个匹配的字符串,而group(n)(其中n是分组的编号)将返回特定分组的匹配结果。groups()返回一个包含所有分组捕获字符串的元组。如果没有匹配的分组,则返回一个空元组。groupdict()如果在正则表达式中使用了命名分组,groupdict()方法会返回一个字典,其中包含所有命名分组的名称和它们的匹配结果。start()和end()start(group)和end(group)方法分别返回指定分组匹配的子串在整个字符串中的起始和结束索引。如果不指定分组,默认为整个匹配。span()span(group)方法返回一个元组,包含指定分组匹配的子串的起始和结束索引。可配置选项(flags)可以通过位或运算符指定多个标志;例如,re.I|re.M设置了I和M标志。ASCII,A使诸如\w、\b、\s和\d的转义仅匹配具有相应属性的ASCII字符。DOTALL,S使.匹配任何字符,包括新行。IGNORECASE,I执行不区分大小写的匹配。LOCALE,L执行依赖于区域设置的匹配。MULTILINE,M多行匹配,影响^和$。VERBOSE,X启用可更清晰和易懂组织的详细正则表达式。实际案例模式查找和替换2021级及以后的学生复旦

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论