1. 程式人生 > >正則表示式.*?探究

正則表示式.*?探究

幾個常見正則表示式

  1. [0-9] \d 匹配數字
  2. \w 字元
  3. {2} {n} 前面表示式出現n次
    • + 前面表示式出現 >= 1
    • ? 0 or 1
    • * >= 0

.*? 懶惰匹配模式

即匹配最短字串,最短匹配,主要是由問號實現

import re
print(re.findall(r'(da?)', 'dads dsds sda daada')) #a出現0或1次
print(re.findall(r'(da*?)', 'dads dsds sda daada')) #a不出現
print(re.findall(r'(da+?)'
, 'dads dsds sda daada')) #a只出現一次 print(re.match(r'(da*?)', 'dads dsds sda daada').group())

輸出結果:
[‘da’, ‘d’, ‘d’, ‘d’, ‘da’, ‘da’, ‘da’]
[‘d’, ‘d’, ‘d’, ‘d’, ‘d’, ‘d’, ‘d’]
[‘da’, ‘da’, ‘da’, ‘da’]
d

當?跟在 *+ 後面時,其含義為最小匹配,+本來代表出現次數大於或等於1,
這裡則限定為了1;* 此時表示出現0次

如果為了匹配da再加一個字元,則需要使用 .

#檢視字串長度
s = 'dads dsds sda daada' print(len(s)) #返回了20個空字串 print(re.findall(r'(.*?)', 'dads dsds sda daada')) #da匹配後再加一個字元(包括空格) print(re.findall(r'(da.+?)', 'dads dsds sda daada')) print(re.findall(r'(da.*?)', 'dads dsds sda daada')) #貪婪匹配,當遇到地一個d時,匹配沒有停止,一直到最後一個d,所以只返回了一個字串 print(re.findall(r'(d.*d)', 'dads dsds sda daada'
)) #非貪婪匹配,第一次遇到d結束匹配,繼續下一次查詢 print(re.findall(r'(d.*?d)', 'dd dads dsds sda daada')) #空格匹配和空字串不一樣,注意 print(re.findall(r'(\s)', 'dd dads dsds sda daada'))
19
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['dad', 'da ', 'daa']
['da', 'da', 'da', 'da']
['dads dsds sda daad']
['dd', 'dad', 'dsd', 'da d']
[' ', ' ', ' ', ' ']

注意正則中的空格,空格也是匹配內容