數量詞

來,繼續加深對正規表示式的理解,這部分理解一下數量詞,為什麼要用數量詞,想想都知道,如果你要匹配幾十上百的字符時,難道你要一個一個的寫,所以就出現了數量詞。

數量詞的詞法是:{min,max} 。 min 和 max 都是非負整數。如果逗號有而 max 被忽略了,則 max 沒有限制。如果逗號和 max 都被忽略了,則重複 min 次。例如,\b[1-9][0-9]{3}\b,匹配的是1000 ~ 9999 之間的數字( “\b” 表示單字邊界),而\b[1-9][0 -9]{2,4}\b,配對的是一個在100 ~ 99999 之間的數字。

下面看一個實例,符合字串中4 到7 個字母的英文

import re
a = 'java*&39android##@@python'
# 数量词
findall = re.findall('[a-z]{4,7}', a)
print(findall)

輸出結果:

['java', 'android', 'python']

注意,這裡有貪婪和非貪婪之分。那我們先看下相關的概念:

貪婪模式:它的特性是一次性地讀入整個字符串,如果不匹配就吐掉最右邊的一個字符再匹配,直到找到匹配的字符字串或字串的長度為0 為止。它的宗旨是讀盡可能多的字符,所以當讀到第一個匹配時就立刻返回。

懶惰模式:它的特性是從字符串的左邊開始,試圖不讀入字符串中的字符進行匹配,失敗,則多讀一個字符,再匹配,如此循環,當找到一個匹配時會傳回該符合的字串,然後再次進行比對直到字串結束。

上面例子中的就是貪婪的,如果要使用非貪婪,也就是懶惰模式,怎麼呢?

如果要使用非貪婪,則加一個? ,上面的例子修改如下:

import re
a = 'java*&39android##@@python'
# 贪婪与非贪婪
re_findall = re.findall('[a-z]{4,7}?', a)
print(re_findall)

輸出結果如下:

['java', 'andr', 'pyth']

從輸出的結果可以看出,android只印製除了andr ,Python 只印出除了pyth ,因為這裡使用的是懶惰模式。

當然,還有一些特殊字元也是可以表示數量的,例如:

?:告诉引擎匹配前导字符 0 次或 1 次
+:告诉引擎匹配前导字符 1 次或多次
*:告诉引擎匹配前导字符 0 次或多次

把這部分的知識點總結一下,就是下面這個表了:

零次或一次出現,等價於{0,1}一次或多次出現 ,等價於{1,}零次或多次出現 ,等價於{0,}恰好 n 次出現至少 n 次枝多 m 次出現至少 n 次出現
貪婪 惰性說明
##? ? ?
# ?
**?
#{n}{n}?
{n,m}#{n,m}?
{n,}{n,}? 




#####
繼續學習