Python程序设计第10章-正则表达式课件.pptx

上传人(卖家):三亚风情 文档编号:2942315 上传时间:2022-06-13 格式:PPTX 页数:41 大小:407.74KB
下载 相关 举报
Python程序设计第10章-正则表达式课件.pptx_第1页
第1页 / 共41页
Python程序设计第10章-正则表达式课件.pptx_第2页
第2页 / 共41页
Python程序设计第10章-正则表达式课件.pptx_第3页
第3页 / 共41页
Python程序设计第10章-正则表达式课件.pptx_第4页
第4页 / 共41页
Python程序设计第10章-正则表达式课件.pptx_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、2022-6-3第第10章章 正则表达式正则表达式目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多模式功能10.5 修改字符串10.6 常见问题2022-6-310.1正则表达式简介正则表达式(Regular Expressions),通常被简称为REs或regexes,是一些由字符和特殊符号组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合,也能按某模式匹配一系列有相似特征的字符串。正则表达式提供了一种紧凑的表示法,可用于表示字符串的组合,其之所以功能如此强大,是因为一个单独的正则表

2、达式可以表示无限数量的字符串,只要字符串满足正则表达式的需求即可。正则表达式为高级文本模式匹配,以及文本的搜索与替代等功能提供了基础。目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多模式功能10.5 修改字符串10.6 常见问题2022-6-310.2 简单模式10.2.1 字符匹配绝大多数字符会与自身匹配。例如,正则表达式test会和字符串“test”完全匹配。这个规则也会有例外,有种字符比较特殊,我们把它们称作元字符(Metacharacters),它们和自身并不匹配,而是会和一些特殊的东西匹配,或者通过某种方式影响到正则表达式的其

3、他部分。元字符的完整列表如下:. $ * + ? | ( )2022-6-310.2 简单模式10.2.1 字符匹配元字符“”与“” 用于指定一个字符类,所谓字符类就是你想匹配的一个字符集。字符可以单个列出,也可以用以“-”号分隔的两个给定字符来表示一个字符区间。举个简单的例子,abc将匹配“a”“b”或“c”中的任意一个字符,使用区间a-c来可以达到与前者一样的目的。只匹配小写字母,那么正则表达式应写成a-z元字符在字符类里并不起作用。例如,abc$将匹配字符。“a”“b”“c”或“$”中的任意一个,虽然“$”通常用作元字符,但在字符类里,其特性被除去,恢复成普通字符。可以用补集来匹配不在区

4、间范围内的字符。其做法是把“”作为字符类的首个字符,其他地方的“”字符只会简单匹配“”字符本身。例如,5将匹配除了“5”之外的任意字符,而5只会匹配字符“5”和“”。2022-6-310.2 简单模式10.2.1 字符匹配另一个重要的元字符是反斜杠“”。 “”为Python中的字符串转义字符,可以通过在反斜杠后面加不同的字符以表示不同特殊意义。它也可以用于取消所有的元字符,这样就能够在模式中匹配它们。例如,如果我们需要匹配字符“”或“”,可以在它们之前用反斜杠来取消它们的特殊意义:“”或“”。一些用“”开始的特殊字符表示预定义的字符集,例如数字集、字母集或其他非空字符集等。2022-6-310

5、.2 简单模式Python的预定义字符集如下:预预设设特特殊殊字符字符说说 明明d匹配任何十进制数,它相当于类 0-9D匹配任何非数字字符,它相当于类0-9s匹配任何空白字符,它相当于类tnrfvS匹配任何非空白字符,它相当于类tnrfvw匹配任何字母数字字符,它相当于类a-zA-Z0-9_W匹配任何非字母数字字符,它相当于类a-zA-Z0-9_2022-6-310.2 简单模式10.2.2 重复正则表达式的另一个功能是可以指定正则表达式的某一部分的重复次数。我们讨论的第一个具有重复功能的元字符是“*”。“*”并不匹配字符“*”,它表示前一个字符可以被匹配任意次数,包括零次。例如,“ca*t”

6、将匹配“ct”(0个“a”字符),“cat”(1个“a”字符),“caaat”(3个“a”字符)等。2022-6-310.2 简单模式10.2.2 重复像“*”这样的重复我们称作是贪婪的(Greedy)。当重复一个正则表达式时,匹配引擎会试图重复尽可能多的次数。如果模式的后面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。例如,模式“abcd*b”。它首先匹配字母“a”,然后零个或更多个来自字符类bcd中的字母,最后以“b”结尾。现在考虑该正则表达式对字符串“abcbd”的匹配。匹配过程如下表所示:2022-6-310.2 简单模式步步 骤骤匹配字匹配字符符注注 解解1a匹配正则表达式中的

7、“a”2abcbd引擎尽可能多地匹配 bcd中的字符,这里匹配到字符串的结尾3失败引擎尝试匹配“b”,但当前位置已经是字符的最后了,所以失败4abcb退回,bcd*尝试少匹配一个字符5失败再次尝次匹配b,但在当前最后一位字符是“d”6abc再次退回,bcd*只匹配“bc”7abcb再次尝试匹配“b”,当前位置上的字符正好是“b”,匹配成功2022-6-310.2 简单模式10.2.2 重复另一个重复元字符是+,表示匹配一次或更多次,注意+要求所匹配的字符至少出现一次。 “ca+t”就可以匹配“cat”(1个“a”),“caaat”(3个“a”),但“ct”不能匹配。还有一些表示重复的元定符。问

8、号?表示匹配一次或零次,我们可以将它用于标识某字符是可选的。例如:“high-?tech”匹配“high-tech”或“hightech”。最复杂的重复限定符是m,n,其中m和n是十进制整数。m,n表示某个匹配项至少需要重复m次,但不能超过n次。例如,a/1,2b可以匹配a/b和a/b,但不能匹配ab与a/b。可以省略m和n中的任意一个,省略m表示重复下限为0,而省略n则表示重复上限为无穷。目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多模式功能10.5 修改字符串10.6 常见问题2022-6-310.3 使用正则表达式10.3.1

9、编译正则表达式Python中通过re模块提供了一个正则表达式引擎的接口,利用这个接口,我们可以将正则表达式编译成对象并用它们来进行匹配。正则表达式被编译成正则表达式对象(Regular Expression Objects),可以为不同的操作提供方法,如模式匹配搜索或字符串替换。使用如下代码编译正则表达式对象: import re p = pile(ab*) pile(ab*)2022-6-310.3 使用正则表达式10.3.2 反斜杠带来的问题则表达式用反斜杠字符“”来表示特殊格式或在不触发其特殊方法的情况下使用特殊字符。这就与Python在字符串中起相同作用的反斜杠字符产生了冲突。例如,为

10、了匹配字符串“section”,正则表达式需要在所有反斜杠字符和其他元字符前添加反斜杠来取消其特殊意义,即要匹配的字符串在程序中应该写成“section”。当把这个字符串作为参数传传递给pile()时必须还是“section”。作为Python的字符串值,“section”中的两个反斜杠还要再次使用反斜杠取消特殊意义,最后结果就变成了“section”。也就是说,为了匹配一个反斜杠,必须在正则表达式字符串中写四个反斜杠,导致输入大量重复的反斜杠,而且所生成的字符串也很难理解。2022-6-310.3 使用正则表达式10.3.2 反斜杠带来的问题解决的办法就是为正则表达式使用Python的原始(

11、raw)字符串表示,在字符串前加上字符“r”,反斜杠就不会被任何特殊方式处理,所以rn就包含“”和“n”的两个字符,而“n”则表示一个字符,即换行。正则表达式在Python代码中通常都是用这种原始字符串表示。如果想要匹配字符串“section”,其原始字符串的表示法应为:rsection。2022-6-310.3 使用正则表达式10.3.3 执行匹配下表给出了正则表达式对象几个最常用的方法:方方 法法目目 的的match()判断从字符串开头是否匹配正则表达式search()搜索整个字符串,找到正则表达式匹配的位置findall()找到所有匹配正则表达式的子串,并将它们作为一个列表返回findi

12、ter()找到所有匹配正则表达式的子串,并将它们作为一个迭代器返回2022-6-310.3 使用正则表达式10.3.3 执行匹配如果匹配失败,match()和search()将返回None。如果匹配成功,就会返回一个 match对象的实例,其中有此次匹配的信息:比如,匹配是从哪里开始在哪里结束,所匹配的子串等。match对象中重要的方法如下表所示:方方 法法目目 的的group()返回匹配正则表达式的字符串start()返回匹配字符串开始的位置end()返回匹配字符串结束的位置span()返回一个包含开始和结束位置的元组2022-6-310.3 使用正则表达式10.3.4 模块级函数re模块提

13、供了顶级函数调用,例如match()、search()、sub()等。没有必要先创建一个正则表达式对象,再调用它的方法。这些函数使用正则表达式字符串作为第一个参数,而后面的参数则与相应正则表达式对象的方法参数相同,返回则要么是None,要么是一个match对象的实例。2022-6-310.3 使用正则表达式10.3.5 编译标志使用编译标志可以修改正则表达式的一些运行方式。在re模块中编译标志可以使用两种形式表示,一是如同IGNORECASE的全名,另一种是一个字母的缩写形式,例如IGNORECASE缩写为I。多个标志可以通过使用或符号“|”来分隔,如“re.I | re.M”表示同时设置I和

14、M标志,该标志在编译正则表达式对象时,以参数的形式输入。2022-6-310.3 使用正则表达式10.3.5 编译标志标标 志志含含 义义ASCII,A使w,b等只匹配ASCII字符DOTALL,S使字符“.”匹配任意字符,包括换行符IGNORECASE,I使匹配对大小写不敏感LOCALE,L做本地化识别(locale-aware)匹配MULTILINE,M多行匹配,会影响VERBOSE,X能够使用正则表达式的verbose状态,使之更加清晰易懂Python正则表达式的编译标志由下表所示:目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多

15、模式功能10.5 修改字符串10.6 常见问题2022-6-310.4 更多模式功能10.4.1 其他元字符零宽界定符(Zero-Width Assertions),包括b和B。b表示单词边界。这是个零宽界定符,用以匹配单词的开头和结尾。之所以被称为零宽界定符,是因为它们如字面意思一样没有“宽度”,在正则表达式中,通常一个字符应对应匹配文本中的一个或数个字符,但零宽界定符不匹配任何字符。例如只匹配“class”整个单词;而当它被包含在其他单词中时不匹配,正则表达式可以写成:rbclassb在Python字符串里,“b”是回退符,使用原始字符串避免冲突。“B”作用正好同“b”相反,只在当前位置不

16、是单词边界时才匹配。2022-6-310.4 更多模式功能10.4.1 其他元字符“|”为“或”操作符,如果A和B均为正则表达式,那么A|B将匹配任何匹配了A或B的字符串。“Jump|Run”将匹配字符串“Jump”或“Run”。“”用于匹配行首,除非设置了MULTILINE标志,否则只匹配字符串开头的部分。设置了MULTILINE标志后,可以匹配每一行的开头。如果需要匹配在一行开头的“From”字符串,正则表达式可以写成“From”。“$”与 “”正好相反,用于匹配行尾的字符串,行尾表示是一个字符串的结尾,或者任何后面紧跟着一个换行符的位置。2022-6-310.4 更多模式功能10.4.2

17、 分组正则表达式也常用来分析字符串,我们可以编写一个正则表达式,匹配字符串中感兴趣的部分,并将其分成几个组(Group)。分组是通过括号“(”和“)”元字符来标识的。位于它们之中的表达式组成一组例如,我们可以用重复限制符,例如*、+、?以及m,n来重复组里的内容。比如(ab)*将匹配零或多个重复的“ab” : p=pile(ab)*) print(p.match(ababababab).span()(0, 10) 分组总是从0开始计数的,而且第0组总是存在的,它就是不显式地使用分组时正则表达式所匹配的字符串,上述match对象的方法都把第0组作为它们的缺省参数。2022-6-310.4 更多模

18、式功能10.4.2 分组通过分组方法获得的小组(Subgroups)是从1开始从左向右计数的。组可以被嵌套,计数的值可以通过从左向右计算括号“(”的数目来确定,第0组即group(0)是一个特殊的组,它是不采取分组时,正则表达式所匹配的字符串2022-6-310.4 更多模式功能10.4.2 分组一个匹配模式中的逆向引用(Backreferences)允许我们指定一个先前分组所获得的内容,并且该内容在当前位置也能找到。用法为反斜杠后紧跟一个分组号。例如,我们有一个逆向引用“1”,用于指定分组1,假设分组1的内容为一个单词“book”,如果在逆向应用出现的位置正好也是单词“book”,那这个匹配

19、就会成功,否则失败。例如,下面的正则表达式会找出在字符串中被连续输入了两次的单词: p=pile(r(bw+)s+1) p.search(Find the the book).group()the the2022-6-310.4 更多模式功能10.4.3 无捕获组和命名组正则表达式会使用很多组,既可以捕获我们感兴趣的子串,又可以分组和结构化表达式本身。在复杂的正则表达式中,追踪组号将变得困难。“无捕获组”与“命名组”这两个功能可以对这个问题有所帮助。它们也都使用正则表达式扩展的通用语法。紧跟在问号后面的字符说明了扩展的内容,例如“(?=foo)”表示一个肯定前向界定符,而“?:foo”则是要讨

20、论的无捕获组。2022-6-310.4 更多模式功能10.4.3 无捕获组和命名组当我们想用一个组代表正则表达式的一部分,但又对获取组中的内容不感兴趣时可以使用一个无捕获组(Non-capturing group)“(?:)”来实现这项功能,括号中的“”被替换成需要的正则表达式: m = re.match(abc)+, abc) m.groups()(c,) m = re.match(?:abc)+, abc) m.groups()() 当不使用无捕获组时,m的groups()方法返回分组1,其内容为字符“c”,而当使用无捕获组后,返回分组中将不会有任何内容。2022-6-310.4 更多模式

21、功能10.4.3 无捕获组和命名组另一个扩展功能是命名组(Named Groups),与通常使用数字引用分组不同的是,它可以用一个名字来引用分组。命名组表示为:(?P),尖括号中的文本即为组的名字,命名组的行为与捕获组是相同的。当对命名组使用match对象的方法时,既可以用表示组号的整数作为参数,也可以用包含组名的字符串作为参数,所以我们可以通过两种方式来得到一个分组中的信息。2022-6-310.4 更多模式功能10.4.3 无捕获组和命名组使用命名可以是我们用容易记住的名字而不是难以记住数字来引用分组例如: InternalDate = pile(rINTERNALDATE r(?P 12

22、30-9)-(?PA-Za-za-z)-r(?P0-90-90-90-9)r (?P0-90-9):(?P0-90-9):(?P0-90-9)r(?P-+)(?P0-90-9)(?P0-90-9)r) 使用分组名zonem来获取分组内容要比记住编号9来获取分组容易得多。在逆向引用的语法中,也可以使用组名代替组号。引用组名的格式为:(?P=name),表示在当前位置,名称为name的组的内容再次重现。2022-6-310.4 更多模式功能10.4.4 前向界定符另外一个零宽界定符是前向界定符,或称为前向断言(Lookahead Assertions)。前向界定符有两种形式肯定(Positive)

23、前向界定符和否定(Negative)前向界定符。(?=pattern)是一个肯定前向界定符,而(?!pattern)是一个否定前向界定符。其中的“pattern”是一个正则表达式,代表某个匹配模式。与通常的匹配模式不同的是,它只返回匹配的结果成功或不成功,而不会引起正则表达式引擎的向前移动。换句话说,前向界定符不会“消耗”字符,而只是判断该位置是否匹配。肯定前向界定符在当前位置能够匹配返回匹配成功,否则失败。2022-6-310.4 更多模式功能10.4.4 前向界定符例如,如果对“a regular expression”这个字符串,我们只想匹配“regular”中的“re”,而不想匹配“e

24、xpression”中的“re”,那么可以这样写正则表达式:re(?=gular)。这表示,当“re”之后紧跟的字符串是“gular”才能匹配。目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多模式功能10.5 修改字符串10.6 常见问题2022-6-310.5 修改字符串除了简单地搜索了一个静态字符串外,正则表达式对象也含有一些方法用于修改字符串。如下表所示方方 法法目目 的的split()字符串分片,返回一个列表(List),分隔的位置为表达式匹配的地方sub()替换所有正则表达式匹配的子串subn()与sub()功能相同,但会返回

25、新的字符串和替换字串的数量2022-6-310.5 修改字符串10.5.1 字符串分片正则表达式对象的split()方法在正则表达式匹配的地方将字符串分片,并返回一个包含分片列表。它同字符串的split()方法相似,但通过正则表达式可以提供更多的分隔符。而字符串的split()方法只支持空白符和固定字符串。Python同样也有一个模块级的re.split()函数。split()方法的原型如下。 split(string , maxsplit = 0)可以通过设置maxsplit的值来限制分片数,当maxsplit非零时,最多只能有maxsplit+1个分片,字符串的其余部分被作为列表的最后一个

26、元素返回。2022-6-310.5 修改字符串10.5.2 搜索与替换下面是一个使用sub()方法的简单例子,使用单词“color”来替换具体的颜色名: p = pile( (blue|white|red) p.sub( color, blue socks and red shoes)color socks and color shoes p.sub( color, blue socks and red shoes, count=1)color socks and red shoes subn()方法作用一样,但返回的是一个包含新字符串和替换执行次数的元组。 p = pile( (blue|w

27、hite|red) p.subn( color, blue socks and red shoes)(color socks and color shoes, 2) p.subn( color, no colors at all)(no colors at all, 0)2022-6-310.5 修改字符串10.5.2 搜索与替换如果替换值是一个字符串,那么任何在其中的反斜杠都会被处理。比如“n”将会被转换成一个换行符,“r”转换成回车等等。未知的转义字符如“j”则保持原样。逆向引用,如“2”,被正则表达式中相应的组所匹配的子串替换,这样可以在替换后的字符串中插入原始文本的一部分。下面的例子匹

28、配单词“section”和紧跟该单词、用括号“”和“”括起来的字符串,并将“section”替换成“subsection”。 p = pile(section ( )* p.sub(rsubsection1,sectionFirst sectionSecond)subsectionFirst subsectionSecond目录目录2022-6-3210.1 正则表达式简介10.2 简单模式10.3 使用正则表达式10.4 更多模式功能10.5 修改字符串10.6 常见问题2022-6-310.6 常见问题贪婪vs不贪婪当在正则表达式中使用重复时,例如a*,正则表达式引擎将尽可能多地尝试匹配。

29、当我们试图匹配一对分界符,比如HTML标签中的尖括号时,这个特性可能会带来困扰。因为元字符*具有“贪婪”的特性,使用一个简单的模式很难匹配单个HTML标签。例如: s = Title len(s)32 print re.match(, s).span()(0, 32) print re.match(, s).group()Title 可以看到正则表达式在匹配“”中的“”后,.*会尽可能多地匹配字符串的剩余部分。最终的匹配会从“”中的“”到“”中的“”,这并不是我们所想要的结果。2022-6-310.6 常见问题贪婪vs不贪婪在这种情况下,一个解决方案是使用“不贪婪”的表达式,比如:*?、+?、?或m,n?,这些表达式会尽可能少地匹配文本。在下面的代码里,“”在第一个“”。这一次我们将得到正确的结果: print re.match(, s).group() 注意使用正则表达式并不适合分析HTML或XML文件。上述例子只是为了说明贪婪和不贪婪匹配。类似的任务最好使用HTML或XML解析器来完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(Python程序设计第10章-正则表达式课件.pptx)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|