python正则表达式(+ {})(二)

加号-重复匹配多次

+ 表示匹配前面的子表达式一次或多次,不包括0次

比如,还是上面的例子,你要从文本中,选择每行逗号后面的字符串内容,包括逗号本身

但是,添加一个条件,如果逗号后面没有内容,就不要选择了。

比如,下面的文本中,最后一行逗号后面没有内容了,就不要选择了

苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,

 就可以这样写正则表达式 ,.+

验证一下如下图所示( + 和 * 的区别就是:不包括0次,所以没有选中最后一行):

 

,.+

 

绿色+

 

 

.+色

 最后一行,猴子逗号后面没有其他字符了,但是?表示匹配一次或0次,所以最后一行也选中了一个逗号字符

,.?

 花括号-匹配指定次数

花括号表示前面的字符匹配 指定的次数

比如,下面的文本

红彤彤,绿油油,黑乎乎,绿油油油油

 表达式 油{3,4}就表示匹配连续的油字至少3次,至多4次

 

实际可以应用于获取手机号:

贪婪模式和非贪婪模式

我们要把下面的字符串中所有html标签都提取出来

source='<html><head><title>Title</title> 

得到这样的一个列表:

['<html>','<head>','<title>','</title>']

 很容易想到使用正则表达式<.*>

写出如下代码

source='<html><head><title>Title</title> 
imort re
p=re.compile(r'<.*>')
print(p.findall(source))

  运行结果却是:

['<html><head><title>Title</title>']

 怎么回事?原来在正则表达式中,' * ',' + ', ' ? '都是贪婪的,使用他们时,会尽可能多的匹配内容

所以,<.*> 中的星号(表示任意次数的重复),一直匹配到了字符串最后的</title>里面的e。

解决这个问题,就需要使用非贪婪模式,也就是在星号后面加上? ,变成这样<.*?>

代码改为:

source='<html><head><title>Title</title>' 
imort re
p=re.compile(r'<.*?>')
print(p.findall(source))

  

posted @ 2020-03-31 22:38  飞鸟与新月  阅读(2759)  评论(0编辑  收藏  举报