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))

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM