來,繼續加深對正規表示式的理解,這部分理解一下數量詞,為什麼要用數量詞,想想都知道,如果你要匹配幾十上百的字符時,難道你要一個一個的寫,所以就出現了數量詞。
數量詞的詞法是:{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 次或多次
把這部分的知識點總結一下,就是下面這個表了:
貪婪 | 惰性 | 說明 |
##? | ? ? | |
# ? | ||
* | *? | |
#{n} | {n}? | |
{n,m} | #{n,m}? | |
{n,} | {n,}? |
#