正则表达式2|学习笔记

简介: 快速学习正则表达式2

开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践正则表达式2】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/1067/detail/15402


正则表达式2

 

内容介绍

一.匹配目标

二.贪婪匹配

三.非贪婪匹配

四.匹配模式

五.转义

 

一.匹配目标

在匹配目标中:例如在'Hello 1234567 Word_This is a Regex Demo'字符串中我们想获取1234567,由此我们可以在1234567左端点和右端点行指点,对把需要匹配的1234567使用括号,由此可以把匹配目标寻找出来。

我们在字符串的下一行输入result=re.match('Hello\(s\d+)\sWorld.Demo$,content),加上Alt符,出现print(result) print(result.group()) print(result.span()),由此我们可以看出输出的结果如下图所示。

Group的结果和原先相同,在Group括号中加1,变成print(result.group(1)),由此我们可以把Group(1)把第一个括号括起来的内容进行输出。

即表达式中出现小括号,则第一个小括号的内容是Group(1),即第二个是Group(2),第三个是Group(3),以此类推,我们可以把匹配目标寻找出来。若我们想从字符中获取想要的数据,可以先把匹配目标用小括号进行括出来,指定左端点和右端点,两边加上\s,再使用Group(1),Group(2),Group(3)的方式把匹配目标寻找出来。

 

二、贪婪匹配

贪婪匹配和非贪婪匹配:我们知道,在匹配字符串时,可以使用点和星的方式进行匹配任意的字符串。

content = "Hello 1234567 World_This is a Regex Demol的下一行输入result = re.match('^He.'),在此过程中,在He之后可以用点和星代替,接着寻找匹配目标,再用小括号进行括起来,最后再进行指定结尾字符,由此变成

result=ra.match('"He.*(\d+).*Damos', content)。

输入print(result)查询匹配结果,将print(result)进行打印,再将group(1)进行打印,Group(1)匹配的是\d+,产生的结果如图所示。

匹配的应是所有的数字,但是运行结果只把数字7的结果匹配出来,而123456被.*完全匹配出。即.*会依次进行匹配,并且会匹配更多的字符。由此我们可以看出.*会直接匹配123456,.*后的\d+至少拥有一个数字,即会把\d+匹配成数字7,.*会尽可能匹配多的数字,直到匹配完为止。

 

三.非贪婪匹配

在非贪婪匹配中,在.*后添加问号,变成result=ra.match('"He.*?(\d+).*Damos', content),运行出的结果,如下图所示。

由此我们可以看出匹配的结果是1234567。问号可以指定模式为非贪婪匹配,匹配少的字符,在问号之后有\d+,即开始匹配数字,若后边出现数字,就会停止匹配,由此可以把.*?匹配成hello后面的空格,\d+会转变成数字1234567。即.*?为非贪婪匹配,匹配尽可能少的字符。我们需要的匹配效果是1234567,即我们可以使用非贪婪模式直接把无关的字符用.*?代替,后边再加上匹配目标,由此可以方便进行匹配。这是非贪婪匹配的一种模式。

 

四.匹配模式

匹配模式:会出现换行的字符串,我们将字符串补充好得到content ="Hello 1234567 World_This is a Regex Demo,再用.*进行匹配。接下来换行输入result = re.match('^He.*?(\d+).*?Demo$', content),再输入print(result)进行打印,打印出的结果是None。原因是点是不能匹配换行符的,在This之后存在换行符。在点的一栏中,我们知道匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。当我们指定匹配模式后,即可以匹配任意字符。

我们在content输入参数re.S,由此指定之后,.*可以匹配任意字符。在print(result)中输入成print(result.group(1)),由此出现的结果是1234567,即完成匹配。

 

五.转义

转义:在匹配时添加了两种符号。若想要匹配特殊符号,可以原样输入result = re.match('price is $5.00', content),再输入print(result)打印,运行后得到结果None,即没有匹配到任意字符。若是特殊字符,直接在表达式中输入特殊字符是不可行的。我们可以写成再进行运行,得到的结果如下图所示。

由此在政策表达式中常见的用法已介绍完。总结出尽量使用泛匹配,使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S。在泛匹配中,若出现长的字符,可以使用.*进行代替,还可以使用.*?进行代替。在贪婪匹配中,匹配目标若需要提取数据,先使用小括号括起来,再使用Group(1),Group(2),Group(3)方式,即可以匹配到所需内容。在非贪婪匹配中,可能会导致结果缺少字符。在匹配模式中,若在整个字符串中出现换行符,这是常见的。

在ATIM中,可以在其后面添加re.S,即可以代替任意字符。以上的用法,在往后的表达式中会应用到。以上使用了re.match的方法演示了应用实例,但是match方法在使用时会出现不方便的时候,例如result=re.match('rice is\$5\.00',content)修改成result = re.match('price is \$5\.00', content)就能完成正常的匹配。在re.match中,若第一个字符是不匹配的,即不能完成正常的匹配。在re.search方法中,可以搜索整个字符串,若出现符合指定表达式的内容,系统会进行直接返回。

即会扫描整个字符串,再返回第一个成功的匹配,例如重新调用re.search匹配,输入result =re.match('Hello.*?(\d+).*?Demo',content),这是一个长的字符串,输入print(result)进行打印,可以发现输入结果是none。即最开头是不匹配的,整个匹配过程是失败的。接着再用re.search方法重新新进行匹配。

把match修改成search

得到result =re.search('Hello.*?(\d+).*?Demo',content),输入print(result)进行打印,再进行运行,得到的结果已然是成功的。即re.search会扫描整个字符串,找到第一个成功的匹配,即会匹配成功。在print(result)下换行输入print(result.group(1))进行打印,成功的找到了1234567,整个匹配是成功的。在整个方法中,尽量使用re.search方法,因为re.match方法需要限定头部是一致的。

相关文章
|
11月前
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
27 0
|
11月前
java202303java学习笔记第二十八天-正则表达式基本练习2
java202303java学习笔记第二十八天-正则表达式基本练习2
47 0
|
11月前
java202303java学习笔记第二十八天-正则表达式基本练习1
java202303java学习笔记第二十八天-正则表达式基本练习1
40 0
|
11月前
java202303java学习笔记第二十八天-正则表达式基本练习3 原
java202303java学习笔记第二十八天-正则表达式基本练习3 原
38 0
|
11月前
java202303java学习笔记第二十七天-正则表达式基本练习1
java202303java学习笔记第二十七天-正则表达式基本练习1
43 0
|
11月前
java202303java学习笔记第二十七天-正则表达式之2
java202303java学习笔记第二十七天-正则表达式之2
38 0
|
11月前
java202303java学习笔记第二十七天-正则表达式之1
java202303java学习笔记第二十七天-正则表达式之1
34 0
|
11月前
java202303java学习笔记第二十七天-正则表达式之4
java202303java学习笔记第二十七天-正则表达式之4
27 0
|
11月前
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
29 0
|
开发者 Python
正则表达式4|学习笔记
快速学习正则表达式4
91 0
正则表达式4|学习笔记

热门文章

最新文章