走入計算機的第二十五天(內置模塊3之正則表達式)
一 什麽是正則表達式
就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言,(在Python中)它內嵌在Python中,並通過 re 模塊實現。正則表達式模式被編譯成一系列的字節碼,然後由用 C 編寫的匹配引擎執行。
正則表達式的功能:字符串的模糊匹配查詢。
二 re模塊
不同的語言均有使用正則表達式的方法,python中是用re模塊實現的。
使用的方法格式:變量名=re.re中的其中一個子模塊("規則","內容")
元字符
1 .(點) :可以代替除換行符以外任意一個元素
1 # ret=re.findall("方..","方傑,方合意,方磊,光東,阿傑,李傑,方何軍") ##匹配出所有符合條件的元素2 # print(ret)
2 ^ :匹配第一個 元素的類容,匹配不成功,也不會去匹配後面的元素
# ret=re.findall("^方.","方傑,方合意,方磊,光東,阿傑,李傑,方何軍") #匹配出所有符合條件的元素 # print(ret)
3 $ :匹配該對象的最後一個內容,不會去匹配其他位置的內容
ret=re.findall("y..n$","方傑,方合意,方磊,光東,阿傑,李傑,方何軍yuan") #匹配出所有符合條件的元素 # print(ret)
4 * :匹配表達式內容的0次到無數次
#ret=re.findall("333\d*","333234214455,333255654534246,545556564367656653,4453576489780423")# print(ret)
5 + : 匹配表達式內容的1次到無數次
#ret=re.findall("333\d+","3334214455,333255654534246,333,56564367656653,4453576489780423") # print(ret)
6 ?: 匹配表達式內容的0次或者1次
# ret=re.findall("\d?","2342,43,7654,87") # print(ret)
7 {}:自定義次數
#ret=re.findall("\d{16}","234214455,663255654534246,545556564367656653,4453576489780423")# print(ret)
*,+,?等都是貪婪匹配,也就是盡可能匹配,後面加?號使其變成惰性匹配
# ret=re.findall(‘131\d+?‘,‘1312312312‘) # print(ret)
匹配一個數字包括整型和浮點型
# ret=re.findall("\d+\.?\d+","3555,8498,64.674,2344") # print(ret)
轉義符
1 反斜杠後面跟元字符,會去掉特殊的功能
# ret=re.findall("\.com","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret)
2 反斜杠後面加上一些普通字符會實現一些特殊的功能
\d 匹配任何十進制數; 它相當於類 [0-9]。
# ret=re.findall("\d","yuan3236$655&34") # print(ret)
\D 匹配任何非數字字符; 它相當於類 [^0-9]。
# ret=re.findall("\D","yuan3236$655&34") # print(ret)
\s 匹配任何空白字符; 它相當於類 [ \t\n\r\f\v]。
# ret=re.findall("\s","hello i love like") # print(ret)
\S 匹配任何非空白字符; 它相當於類 [^ \t\n\r\f\v]。
# ret=re.findall("\S","hello i love like") # print(ret)
\w 匹配任何字母數字字符; 它相當於類 [a-zA-Z0-9_]。
# ret=re.findall("\w","yuan323665534") # print(ret) # ret=re.findall("\w+","yuan323665534") # print(ret)
\W 匹配任何非字母數字字符; 它相當於類 [^a-zA-Z0-9_]
# ret=re.findall("\W","yuan3236$655&34") # print(ret)
\b 匹配一個特殊字符邊界,比如空格 ,&,#等\b是特殊符號所以前面需要加r
# ret=re.findall(r"i\b","hello i love like") # print(ret) # ret=re.findall(r"i\b","hello i love li$ke") # print(ret)
分組 ()
ret=re.findall("(fang)","fangffksdl;hfangfangfnag") # print(ret) # # ret=re.findall("(fang)+","fangffksdl;hfangfangfnag") # print(ret)
# ret=re.findall("方","方傑,方合意,方磊,光東,阿傑,李傑,方何軍") ##匹配出所有符合條件的元素
# print(ret) m = re.findall(r‘(ad)+‘, ‘add‘) print(m) ret=re.search(‘(?P<id>\d{2})/(?P<name>\w{3})‘,‘23/com‘) print(ret.group())#23/com print(ret.group(‘id‘))#23
#命名分組
ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(\d+)","blog-aticles-2005-12")
print(ret.group(‘year‘))
ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(?P<mansh>\d+)","blog-aticles-2005-12")
print(ret.group(‘mansh‘))
字符集 |
字符集 | 或者的意思 要配合 ()用的
# ret=re.findall("www\.(\w+)\.(com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret) # ret=re.findall("www\.(?:\w+)\.(?:com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn") # print(ret)
字符集 []
字符集[]: 在[]裏面多選一的效果 一個字符集只匹配一個字符
# ret=re.findall(r"a[bc]","abcjpofdabhiac") # print(ret) # ret=re.findall(r"a[bc]d","abdcjpofdabhiacd") # print(ret) # ret=re.findall(r"a[b.c]d","abcjpofdabhia.dc") # print(ret)
字符集裏面只有三個特殊符號:- ^ \
# ret=re.findall(r"[0-9]","ds1246634347cvkdhsd") # print(ret) # # # ret=re.findall(r"[a-z]","ds1246634347cvkdhsd") # print(ret) # # ret=re.findall(r"[A-Z]","ds1246DSJFKS47cvkdhsd") # print(ret) # # ret=re.findall(r"[A-Za-z0-9]","ds1246634347cvkdhsd") # print(ret) # ret=re.findall(r"a[\d]c","ds12a34c7cvkdhsd") # print(ret) # ret=re.findall(r"[^\d]","ds1246634347cvkdhsd") # print(ret) # ret=re.findall(r"[^\da-z]","ds1246634347cvk#dhsd") # print(ret)
search 函數會在字符串內查找模式匹配,只到找到第一個匹配然後返回一個包含匹配信息的對象,沒有則會則返回None,該對象可以通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,就會報錯
#只有匹配到了一項內容就不會在繼續匹配了 ret=re.search("(fang)+","fangffksdl;hfangfangfnag") print(ret) print(ret.group()) #沒有匹配內容則會返回None,group()則會報錯報錯 ret=re.search("(fakl)+","fangffksdl;hfangfangfnag") print(ret) print(ret.group())
match 函數會在字符串開始位置查找模式匹配對象,沒有則會則返回None,該對象可以通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,就會報錯
#match 只匹配字符串開頭的位置 # ret=re.match("(fang)+","fangffksdl;hfangfangfnag") # print(ret) # print(ret.group()) #開頭位置匹配不上就會報錯 # ret=re.match("(fang)+","sdffangffksdlaihngfangfnag") # print(ret) # print(ret.group())
,
走入計算機的第二十五天(內置模塊3之正則表達式)