详解Python3中的正则表达式的基本用法(2)

import re content = 'Hello 123 4567 World_This is a Regex Demo' print(len(content)) reresult = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content) print(result) print(result.group()) print(result.span())

运行结果:

41 
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'> 
Hello 123 4567 World_This 
(0, 25)

在这里我们首先声明了一个字符串,包含英文字母、空白字符、数字等等内容,接下来我们写了一个正则表达式^Hellosdddsd{4}sw{10}来匹配这个长字符串。

开头的^是匹配字符串的开头,也就是以Hello开头,然后s匹配空白字符,用来匹配目标字符串的空格,d匹配数字,三个d匹配123,然后再写一个s匹配空格,后面还有4567,我们其实可以依然用四个d来匹配,但是这么写起来比较繁琐,所以在后面可以跟{4}代表匹配前面的字符四次,也就是匹配四个数字,这样也可以完成匹配,然后后面再紧接一个空白字符,然后w{10}匹配10个字母及下划线,正则表达式到此为止就结束了,我们注意到其实并没有把目标字符串匹配完,不过这样依然可以进行匹配,只不过匹配结果短一点而已。

我们调用match()方法,第一个参数传入了正则表达式,第二个参数传入了要匹配的字符串。

打印输出一下结果,可以看到结果是SRE_Match对象,证明成功匹配,它有两个方法,group()方法可以输出匹配到的内容,结果是Hello 123 4567 World_This,这恰好是我们正则表达式规则所匹配的内容,span()方法可以输出匹配的范围,结果是(0, 25),这个就是匹配到的结果字符串在原字符串中的位置范围。

通过上面的例子我们可以基本了解怎样在Python中怎样使用正则表达式来匹配一段文字。

匹配目标

刚才我们用了match()方法可以得到匹配到的字符串内容,但是如果我们想从字符串中提取一部分内容怎么办呢?就像最前面的实例一样,从一段文本中提取出邮件或电话号等内容。

在这里可以使用()括号来将我们想提取的子字符串括起来,()实际上就是标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,我们可以调用group()方法传入分组的索引即可获取提取的结果。

下面我们用一个实例感受一下:

import re content = 'Hello 1234567 World_This is a Regex Demo' reresult = re.match('^Hello\s(\d+)\sWorld', content) print(result) print(result.group()) print(result.group(1)) print(result.span())

依然是前面的字符串,在这里我们想匹配这个字符串并且把其中的1234567提取出来,在这里我们将数字部分的正则表达式用()括起来,然后接下来调用了group(1)获取匹配结果。

运行结果如下:

<_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'> 
Hello 1234567 World 
1234567 
(0, 19)

可以看到在结果中成功得到了1234567,我们获取用的是group(1),与group()有所不同,group()会输出完整的匹配结果,而group(1)会输出第一个被()包围的匹配结果,假如正则表达式后面还有()包括的内容,那么我们可以依次用group(2)、group(3)等来依次获取。

通用匹配

刚才我们写的正则表达式其实比较复杂,出现空白字符我们就写s匹配空白字符,出现数字我们就写d匹配数字,工作量非常大,其实完全没必要这么做,还有一个万能匹配可以用,也就是.,.可以匹配任意字符(除换行符),又代表匹配前面的字符无限次,所以它们组合在一起就可以匹配任意的字符了,有了它我们就不用挨个字符地匹配了。

所以接着上面的例子,我们可以改写一下正则表达式。

import re content = 'Hello 123 4567 World_This is a Regex Demo' reresult = re.match('^Hello.*Demo$', content) print(result) print(result.group()) print(result.span())

在这里我们将中间的部分直接省略,全部用.*来代替,最后加一个结尾字符串就好了,运行结果如下:

<_sre.SRE_Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'> 
Hello 123 4567 World_This is a Regex Demo 
(0, 41)

可以看到group()方法输出了匹配的全部字符串,也就是说我们写的正则表达式匹配到了目标字符串的全部内容,span()方法输出(0, 41),是整个字符串的长度。

因此,我们可以在使用.*来简化正则表达式的书写。

贪婪匹配与非贪婪匹配

在使用上面的通用匹配.*的时候可能我们有时候匹配到的并不是想要的结果,我们看下面的例子:

import re content = 'Hello 1234567 World_This is a Regex Demo' reresult = re.match('^He.*(\d+).*Demo$', content) print(result) print(result.group(1))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjxjff.html