加號-重復匹配多次
+ 表示匹配前面的子表達式一次或多次,不包括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))