社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

初识Python正则表达式(9课连发)

Python小屋 • 7 年前 • 769 次点击  

本文由屋友彭东成投稿。

=======================

第一课

首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候也十分常用,大家可以把它学的简单一些,但是不能不学。

尽管网络爬虫相关库给我们提供了丰富的库如css、bs4lxml等等,让我们可以通过选择器去匹配字符串,但是在HTML中数据往往存在标签之中。通过选择器确实可以匹配到标签的内容,但是有时候标签中存在的许多内容是冗余的,而我们只需要匹配其中部分内容即可(如匹配数字、时间等),如下图所示。通过选择器,我们一般可以获取到“782好笑”这个字符串,但是我们只需要“782”这个数字的话,此时正则表达式就要派上用场了。

正则表达式可以帮我们判断某个字符串是否符合某一个模式,其次正则表达式可以帮我们提取某个字符串中的重要部分,做子字符串的提取。今天简单的给大家讲解几个正则表达式的特殊字符—— “^”、“.”、“*”,并且用实例进行演示,让大家对正则表达式有个初步的了解。

本文用的Python是3版本,开发环境用的是pycharm,首先在本地新建一个demo.py文件,接下来开始进行演示。

1、正则表达式在Python中有个专门的库叫re模块,首先进行导入模块。再定义一个字符串str,然后定义一个正则表达式匹配规则regex 

2、“^d”代表的意思是以d元素开头的任意一个字符串,也就是说只要是以d开头的字符串,后面的元素不论是什么,都是符合规则的,总之必须要以d开头。 

3、“.” 较为常用,其代表的意思是任意字符,其表示的范围非常广,可以接任意字符,不论是中英文,还是下划线之类的特殊字符,都是可以代表的。举个栗子,正则表达式“^d.”就是代表以d开头的字符串,b后边接任意字符都可以。 

4、“*” 也十分常用,其代表的意思是前面的字符可以重复任意多遍,可以是0次,1次,2次等任意多次。 

5、了解好这几个特殊字符的用法之后,接下来通过代码简单的感受一下。如下图所示,如果匹配成功,则返回yes;如果没有匹配成功,则不返回任何东西。

可以看到程序运行之后,返回的结果为yes,说明匹配成功。正则表达式“^d.*”代表的意思是以d开头的字符串,后面跟着任意字符,出现任意多遍。显然,通过匹配可以得知该正则表达式匹配的结果和原始字符串一致,之后if判断返回值为true,所以打印出结果为yes

6、为了进一步验证这个模式是否正确,我们将b改为a,其代表的意思该模式下的字符串是否以a开头的。之后再次运行程序,如下图所示。

此时可以看到无任何输出,说明特殊字符“^”起到了作用。

=========================

第二课

今天继续给大家分享Python正则表达式相关特殊字符知识点。

1、特殊字符“$”代表的意思是结尾字符。举个栗子,正则表达式“3$”,表示匹配以3为结尾的字符串。代码演示如下图所示。

正则表达式匹配模式.*3$”代表以3结尾的任意字符的字符串,很显然匹配的结果和原始字符串是一致的,所以有返回结果。

2、如果将正则表达式匹配模式改为.*4$”,则表示以4结尾的任意字符的字符串,此时是没有任何的输出结果的,如下图所示。

3正则表达式特殊字符?”比较常用,其代表的意思是非贪婪匹配模式。默认情况下,匹配字符串是一种贪婪的匹配,换句话说,默认情况下字符串会根据匹配模式,去匹配最大的长度。 

4、下图是一个实例。其中括号代表的是提取字符串的子串,正则表达式会把满足匹配条件的字符串放到括号里边。匹配模式.*(p.*p).*”代表的意思是:左边的“.* ”的意思是任意字符串,可以是空,也可以是非空的字符串,之后是字符p,中间的“.* ” 的意思也是任意字符串,之后再是一个p,尔后右边的“.* ” 的意思也是任意字符串。目前的逻辑就是将两个p中间的字符串连同p一块取出。

但是其输出的结果却为pp”,并不是我们想要的“pccccccccccp”结果。原因是正则表达式的贪婪匹配所致,实际上它是反向匹配的,所以从字符串来看,匹配到的结果是“pp”。 

5、如果我们使用非贪婪模式,即将匹配模式“.*(p.*p).*”改为模式“.*?(p.*p).*”,在第一“p”之前加个特殊字符“?”,则运行的结果就如下图所示。

可以看到匹配模式已经开始从左边开始进行匹配,答案趋向于我们想要的结果。但是在后面却出现了两个p。原因是后面的那个p未指定其为非贪婪模式,所以后面的那个p仍然是从右边开始反向取值的。

6、接下来,我们继续使用非贪婪模式,即将匹配模式“.*(p.*p).*”改为模式“.*?(p.*?p).*”,在第二“p”之前也加个特殊字符“?”,则运行的结果就如下图所示。

此时可以看到匹配的结果就是我们想要的结果了,原因是此时两个p均采用了非贪婪模式,所以匹配模式,从左到右顺序进行。

7、理解非贪婪模式之后,对于正则表达式的匹配就很好理解了,如下图的结果将返回“pcccp”,非贪婪模式下。

8、下图的结果将返回“pcccpcccccccpppp”,非贪婪模式和贪婪模式共存的情况下。

非贪婪模式在网络爬虫的过程中对于字符串的提取非常重要,务必要理解和掌握。

==============

第三课

今天继续给大家分享Python正则表达式基础。

1、正则表达式特殊字符“+”,其代表的意思“+”号前面的任意字符必须至少出现一次,才能匹配成功。如下图所示,如果没有加特殊字符“+”,则按照前面介绍的贪婪模式从右边进行匹配,输出的结果为“pp”。

2、现在将匹配模式由之前的“.*(p.*p).*”改为“.*(p.+p).*”,即将特殊字符“*”改为特殊字符“+”,用特殊字符“+”来限定前面的字符出现的次数,至少出现一次。运行程序,得到的结果为“ppp”,如下图所示。

简单的来理解一下,首先贪婪模式不在赘述,然后匹配到第一个字符p,之后碰到特殊字符“+”,表示匹配任意字符,但该字符至少出现一次,然后再匹配到第二个字符p,才会提取到匹配的字符串。

3、再次来感受一下,将之前的三个ppp改为现在的php,之后再运行程序,如下图所示,得到的结果是php

4、如果将之前的三个ppp改为现在的phhp,会有什么样的结果呢?如下图所示,毋庸置疑,答案肯定是phhp

因为特殊字符“+”号表示只要任意字符至少出现一次,都会被提取出来。

5、简单的来总结一下,特殊字符“*”和特殊字符“+”都是用来表示字符出现次数的限定词,用于限定前面的任意字符出现的次数。不同的地方在于特殊字符“*”模式下,字符出现的次数可以是0次或者任意多次,而特殊字符“+ ”模式下,字符出现的次数至少是1次。

=====================

第四课

今天继续给大家分享Python正则表达式基础知识,主要给大家介绍一下特殊字符{}”的用法。

特殊字符“{}”实质上也是一个限定词的用法,其限定前面字符所出现的次数,其常用的模式有三种,分别是“{数字}”、“{数字,}”和“{数字1, 数字2}”。举个例子,如“{1}”、“{1,}”和“{1, 3}”。到这里可能大家还不是很清楚,下面依次通过实例来演示一下,加深对特殊字符“{}”的理解。

1、如下图所示,限定字符p前面的字符出现1次,则根据贪婪匹配模式,pap成功匹配到。

2、如果将匹配模式更改为“.*(p.{2}p).*”,则无任何的输出,如下图所示,因为此时并没有任何的字字符串符合匹配条件。

3、相应的,我们将原始字符串做一下更改,如下图所示,此时“.*(p.{2}p).*”匹配模式有对应的结果,如下图所示。

4、特殊字符“{1,}”代表的是前面的字符出现1次及以上;特殊字符“{2,}”代表的是前面的字符出现2次及以上;特殊字符“{3,}”代表的是前面的字符出现3次及以上;以此类推。举个栗子,如下图所示。

我们要匹配出现p字符前面出现3次及以上的次数,此时子字符串phhhhp被提取出来,但是pappaap都没有提取到,因为其不满足匹配条件。

5、特殊字符“{1, 3}” 代表的是前面的字符至少出现1次,最多出现3次;特殊字符“{2, 5}” 代表的是前面的字符至少出现2次,最多出现5次;以此类推。举个栗子,如下图所示。

当使用特殊字符“{1, 3}”的时候,如下图所示:

贪婪模式下,字符串从右边开始往左取,首先遇到相对满足条件的子字符串是phhhhp,但是并不符合规则,因为该子字符串出现的次数为4次,而限定条件为1次到3次,所以这个子字符串不符合匹配条件,尔后继续往前匹配,得到匹配结果paap,满足匹配条件。

6、同理,当使用特殊字符“{3, 5}”的时候,如下图所示:

根据上一步的分析可以得知,该匹配结果为phhhhp。

==================

第五课

今天要给大家的讲的特殊字符是竖线“|”。竖线“|”实质上是一个或的关系。

1、直接上代码演示,比方说我们需要匹配一个字符串“dcpeng123”,匹配模式为 “(dcpeng|dcpeng123)”,记得匹配模式中要有括号,否则后面的group方法会报错。

如上图所示,匹配模式“(dcpeng|dcpeng123)”的意思是只要匹配“dcpeng”或者“dcpeng123”中的任意一个,就说明提取成功。“|”实质上是一个“或”的关系,匹配的结果为“dcpeng”可以满足匹配条件,匹配的结果为“dcpeng123”也可以满足匹配条件。所以在这里,正则表达式首先匹配了字符串“dcpeng”,所以打印出来的结果就是“dcpeng”。

2、当我们把匹配模式中两个字符串的顺序调整一下,如下图所示。

根据第一步的分析步骤,其匹配结果为“dcpeng123”,在此就不再赘述了。

3、如果我们将原始字符串做一下更改,更改为“dcpeng”,而保持匹配模式不变,如下图所示。

此时的匹配结果为“dcpeng”。原因是匹配模式首先是“dcpeng123”,与原始字符串匹配不上,之后通过特殊字符“|”再定位到“dcpeng”,发现可以与原始字符串匹配上,所以匹配成功,输出匹配结果。

4、如果我们只是想匹配字符串中的一部分,那应该如何做呢?如下图所示,只需要将匹配模式用括号括起来就可以了,而括号外面的部分保持与原始字符串一致即可。

此时可以看到输出的结果为“dcpeng”。这里容易犯错,很多小伙伴很可能以为结果是“dcpeng123”,只需要记住我们匹配的内容只是在括号中,外边的世界与我们无关。

同样的,如果我们将原始字符串改为“dccpeng123”,保存匹配模式不变,此时的匹配结果为“dccpeng”,如下图所示。

5、如果真想匹配到外边的结果,就应该再加一层括号,将外边的内容与括进来,入下图所示。当程序运行之后,我们得到的匹配结果是“dccpeng123”。

当程序运行之后,实际上是以最外层的这个括号为顺序的,然后依次向内进行匹配。当group方法中取第一个括号的内容时,匹配到的结果是最外层括号中的内容,所以是“dccpeng123”。可以看到“123”也被提取出来了。

同理,当group方法中取第二个括号的内容时,匹配到的结果是最二层括号中的内容,所以是“dccpeng”,如下图所示。

此时可以看到“123”并没有被提取出来,因为此时匹配的内容是“(dcpeng|dccpeng)”。

关于在括号中提取子字符串的用法在网络爬虫中非常常见,也是Python正则表达式的重点学习内容,需要重点掌握。

====================

第六课

今天给大家分享的正则表达式特殊符号是“[]”。中括号十分实用,其有特殊含义,其代表的意思是中括号中的字符只要满足其中任意一个就可以。其用法一共有三种,分别对其进行具体的代码演示,在最后进行总结,具体的教程如下。

1、如下图所示,匹配模式为[abcd],在这里正则表达式代表的意思是字符串第一个字符是abcd四个字符中的任意一个,然后后面的字符是“cpeng123”,如果满足匹配条件,则输出结果,如果不满足,则不显示任何结果,如下图所示。

很显然原始字符串的第一个字符是d,和匹配模式相接,所以输出结果。

2、为了更好的加强理解,现在将原始字符串改为“acpeng123”,其他部分不做改动,如下图所示。

可以看到匹配的结果是“acpeng123”,匹配成功。

3、为进一步理解中括号的意思,现在将原始字符串改为“ecpeng123”,其他部分不做改动,如下图所示。

此时可以看到没有任何结果输出,因为在中括号中没有对应的匹配字符,满足不了匹配要求,所以无任何输出。

4、看下面一个例子,提取电话号码,这个在实际应用中十分常见。在这里介绍中括号的另外一种表达方式即[0-9],这个特殊字符代表的意思是数字09中的任意一个字符。下面的匹配模式'(1[34578][0-9]{9})'代表的意思是字符串以1开头,然后第二个字符为34578中任意一个,之后的字符是09中的数字,但是限定为 9次,也就是说电话号码的长度为1+1+9=11位。如果满足上面的匹配要求,就输出成功,否则就不输出任何的字符。

如上图,很明显原始字符串满足匹配的要求,所以有输出结果。

拓展知识:[a-z]代表26个英文小写字母;[A-Z]代表26个英文大写字母。

5、为了进一步加强理解,将原始字符串改为160开头的号码,然后进行输出,如下图所示。

可以看到无任何输出结果。

6、中括号的第三章用法是[^],在中括号中加入特殊字符“^”,表示非,取反的意思。举个栗子,“[^1]”的意思是字符不等于1,下图是代码演示。

可以看到原始字符串与匹配模式'(1[34578][^1]{9})'匹配成功,因为从第二个字符之后,字符串中就没有1出现,符合匹配规则。

即便是原始字符串中出现非数字的字符,只要不是1,也能够匹配成功,如下图所示。

7为了加强理解,先将原始字符串中的号码改为18042682515’,在字符串后边加个1,然后匹配模式不改变,如下图所示。

可以看到此时无任何输出结果,因为原始字符串中出现了1,而匹配模式要求不能出现1,所以匹配不成功。

8最后总结一下特殊字符中括号的用途。

一、中括号中的任意一个字符,如[abcd],代表abcd这四个字符中的任意一个。

二、表示区间,如[0-9],代表数字09中的任意一个。同理[a-z][A-Z],其代表的意思在上面有提及,在此就不再赘述了。

三、表示非或者取反,专有的表达式是[^],如匹配模式[^1]表示匹配的字符不为1

四、中括号中的“.”,如匹配模式[.]或“*”,如匹配模式[*],就是纯粹的代表“.”号和“*”号,不再是代表特殊字符中代表的任意字符或出现多次的意思,这点需要特别注意。

===================

第七课

今天给大家分享的特殊字符是“\s”、“\S”。

1、“\s”代表的意思是匹配空格,匹配模式“加\s油”代表的是字符“加”和“油”之间有空格的意思,如下图所示。

可以看到原始字符串中“加”和“油”之间有空格,与匹配条件相符合,所以匹配成功。

2、为了加强理解,现在将原始字符串改为“加加油”,字符中间不为空格,保持匹配模式不变,如下图所示。

可以看到无任何输出,说明匹配不成功。

3、如果“加”和“油”之间有多个空格的话,则只需要在匹配模式中将“加\s油”改为“加\s+油”即可,如下图所示。

4、“\S”代表的意思与“\s”代表的意思刚刚相反,也就是说匹配的那个字符只要不是空格,都可以匹配。如下图所示,继续用第二步那个例子,只要将匹配模式中的“\s”改为“\S ”,其他的保持不变,如下图所示。

可以看到此时就可以匹配成功。

5、而将原始字符串改为“加 油”,两个字符中间有个空格,匹配模式不变,如下图所示。

可以看到此时无任何输出,说明匹配不成功。

6、同样的,如果要匹配多个非空白字符的话,只需要将“\S”改为“\S+”即可,如下图所示。

=====================

第八课

今天给大家分享的特殊字符是“\w”“\W”

1、“\w”代表的意思是该字符为任意字符,但是和特殊字符“.”的意思不同。“\w”代表的字符主要包括26个大写字母AZ,即[A-Z]26个小写字母az,即[a-z]10个阿拉伯数字09,即[0-9]和下划线“_”。总结起来就是,“\w”代表的意思是[A-Za-z0-9_]中任意一个字符。“.” 代表的意思是除换行符之外的任意字符,其范围比\w”代表的意思要广。

下面是具体的代码演示,如下图所示:

可以看到此时用的是特殊字符中括号来代替特殊字符“\w”,匹配成功。

2、现在将[A-Za-z0-9_]改为\w,如下图所示。

可以看到仍然可以匹配成功。

3、将原始字符串改为“加A油”,如下图所示。

可以看到仍然可以匹配成功。

4、将原始字符串改为“加_油”,如下图所示。

可以看到仍然可以匹配成功。

5、当将原始字符串改为“加-油”,如下图所示。

可以看到此时就不可以匹配成功了,因为字符“-”并在包括在\w涵盖的范围之内。

6、“\W”代表的意思与“\w”刚刚相反,也就是匹配除了[A-Za-z0-9_]之外的其他字符。接上一步的例子,此时将“\w”改为“\W”,如下图所示。

可以看到此时就匹配成功了。

7、将原始字符串“加-油”改为“加 油”,中间有空格,其他保持不变,如下图所示。

很显然,使用“\w”肯定不能匹配成功,但使用“\W”便可以成功的进行匹配。

8、为了进一步加强对这两个符号的理解,将原始字符串中的中划线“-”改为下划线“_”,其他的保持不变,如下图所示。

此时可以看到匹配不成功,无任何输出。

=======================

第九课

今天给大家分享的特殊字符是[\u4E00-\u9FA5],这个特殊字符最好能够记下来,如果记不得的话通过百度也是可以一下子查到的。

该特殊字符是固定的写法,其代表的意思是汉字。换句话说,只要字符中是汉字,就可以通过该字符进行匹配,该特殊字符也是用中括号括起来的。具体的代码演示如下。

1、原始字符串是“加油”,两个汉字,然后将匹配模式直接为[\u4E00-\u9FA5],如下图

可以看到此时的输出结果仅仅出现了一个“加”字,因为该匹配模式默认是匹配一个字符。

2、如何想匹配多个字符,只需要在匹配模式后面加一个“+”号即可,表示匹配连续出现的汉字,如下图所示。

此时可以看到“加油”全都匹配出来了。

3、为了进一步加强对该特殊字符的理解,现在将“加油”两字中嵌入非汉字,如下图所示。

可以看到只匹配到了“加”,但是非汉字字符“a”及其以后的字符全部都匹配不到了,因为原始字符串并不是连续出现的汉字。

4、将非汉字字符放到字符串最后边,如下图所示。

此时可以看到“加油”这两个连续的汉字可以成功匹配,但是非汉字字符匹配不到。

5、如果将“加油”中间加个空格,改为“加 油”,其他的保持不变,如下图所示。

此时可以看到输出的结果仅仅是个“加”字,空格及其之后的字符都匹配不到,因为原始字符串并不是连续出现的汉字。

6、举个栗子,在实际应用中,往往会需要用到连续匹配汉字的地方。如现在有个需求,需要匹配字符串中的“XX”大学,如“清华大学”、“北京大学”、“中山大学”等,我们只知道字符“XX”是连续的中文,此时就可以用到本文介绍的汉字字符,如下图所示。

此时可以看到“清华大学”匹配成功。需要注意的是特殊字符“?”记得加上,代表非贪婪模式,如果不加这个字符的话,则匹配模式从字符的后面往前取,得到的结果仅仅为“华大学”,如下图所示。

7、同样的,如果要匹配“上海交通大学”,也是如此,如下图所示。



温馨提示

进入公众号,通过菜单“最新资源”==>“历史文章”可以快速查看分专题的文章列表,通过“最新资源”==>“微课专区”可以观看Python微课,通过“最新资源”==>“培训动态”可以查看近期Python培训安排,通过“最新资源”==>“教学资源”可以查看Python教学资源。


--------董付国老师Python系列图书--------

1)《Python程序设计(第2版)》清华大学出版社(2018年8月第9次印刷)https://item.jd.com/11949168.html

2)《Python可以这样学》清华大学出版社(2018年7月第6次印刷)(本书已在台湾发行繁体版) https://item.jd.com/12040511.html

3)《Python程序设计基础(第2版)》清华大学出版社(2018年9月第6次印刷)https://item.jd.com/12319738.html

4)《中学生可以这样学Python》清华大学出版社(2018年9月第3次印刷)https://item.jd.com/12258900.html

5)《Python程序设计开发宝典》清华大学出版社(2018年2月第3次印刷)https://item.jd.com/12143483.html

6)《玩转Python轻松过二级》清华大学出版社(2018年7月第3次印刷)https://item.jd.com/12361144.html

7)《Python程序设计基础与应用》机械工业出版社(2018年9月第1次印刷)https://item.jd.com/12433472.html?dist=jd

8)《Python程序设计实验指导书》清华大学出版社(预计2019年1月出版)

9)《Python编程基础与案例集锦(中学版)》电子工业出版社(预计2019年2月出版)

董老师127课免费视频地址: https://pan.baidu.com/s/1jJeAs8Q 密码: px59


Python课堂上我与学生斗智斗勇已8个学期

非计算机专业《Python程序设计基础》教学参考大纲

计算机相关专业“Python程序设计”教学大纲(参考)

《Python程序设计》实验指导书(30个实验)

《Python程序设计基础与应用》课后习题答案

《Python程序设计基础(第2版)》习题答案

Python课程期末考试编程题自动批卷原理与实现模板

“Python小屋”免费资源汇总(截至2018年11月28日)


系列教学PPT:

1900页Python系列PPT分享一:基础知识(106页)

1900页Python系列PPT分享二:Python序列(列表、元组、字典、集合)(154页)

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

1900页Python系列PPT分享四:字符串与正则表达式(109页)

1900页Python系列PPT分享五:函数设计与应用(134页)

1900页Python系列PPT分享六:面向对象程序设计(86页)

1900页Python系列PPT分享七:文件操作(132页)

1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)

报告PPT(163页):基于Python语言的课程群建设探讨与实践

报告PPT(123页):Python编程基础精要

2000页Python系列PPT分享九:(GUI编程)(122页)

Python实验项目1例:使用进程池统计指定范围内素数的个数

(PPT)Python程序设计课程教学内容组织与教学方法实践



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6vkCg0YjlK
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/27443