正則表達式由普通字符和元字符組成. 普通字符包含⼤⼩寫字⺟, 數字. 在匹配普通字符的時候咱們直接寫就能夠了. 好比"abc" 匹配的就是"abc". 咱們若是⽤python也能夠實現相同的效果. 因此普通字符沒什麼好說的. 重點在元字符上. 元字符: 元字符纔是正則表達式的靈魂.
元字符的組成:
1,字符組 [a-zA-Z0-9] 字符組很簡單⽤[]括起來. 在[]中出現的內容會被匹配
2,簡單的元字符
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線
\s 匹配任意的空白符
\d 匹配數字
\n 匹配一個換行符
\t 匹配一個製表符
\b 匹配一個單詞的結尾
^ 匹配字符串的開始
$ 匹配字符串的結尾
\W 匹配非字母或數字或下劃線
\D 匹配非數字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括號內的表達式,也表示一個組
[...] 匹配字符組中的字符
[^...] 匹配除了字符組中字符的全部字符
3,量詞
* 重複零次或更屢次
+ 重複一次或更屢次
? 重複零次或一次(儘量少的匹配)
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次
4. 惰性匹配和貪婪匹配
在量詞中的*, +,{} 都屬於貪婪匹配. 就是儘量多的匹配到結果
5,轉義符
r' 內容'這時候內容裏面寫的能夠進行轉義,能夠少寫一個轉義符
re模塊
re的核心功能有四個
1,findall 查找全部,返回list。re.findall(正則表達式,要匹配的對象)
2,search 返回匹配的第一個結果,若是沒有返回None.返回的對象並不能直接操做,須要用group()來操做,由於只能返回第一個結果,因此group()裏面的數字只能是0或者空。
ret = re.search(r'\d', '5點以前. 你要給我88888萬').group(0)
print(ret)
3,match 只能從字符串的開頭進行匹配,沒有則返回None
4,finditer 和findall差很少,可是返回的是一個迭代器,一樣須要group()進行操做
ret = re.finditer(r'\d+', '5點以前. 你要給我88888萬')
#print(list(ret)[0].group())
for el in ret:
print(el.group())
其餘功能:
1,re.split()
ret = re.split('[ab]', 'qwerafjbcd') # 先按'a'分割獲得'qwer'和'fjbcd',在
對'qwer'和'fjbcd'分別按'b'分割
print(ret) # ['qwer', 'fj', 'cd']
2,re.sub()
ret = re.sub(r"\d+", "_sb_", "alex250taibai250wusir250ritian38") # 把字符串中
的數字換成__sb__
print(ret) # alex_sb_taibai_sb_wusir_sb_ritian_sb_
3,re.subn()
ret = re.subn(r"\d+", "_sb_", "alex250taibai250wusir250ritian38") # 將數字替
換成'__sb__',返回元組(替換的結果,替換了多少次)
print(ret) # ('alex_sb_taibai_sb_wusir_sb_ritian_sb_', 4)
4,re.comile()
obj = re.compile(r'\d{3}') # 將正則表達式編譯成爲⼀個 正則表達式對象, 規則要匹配的
是3個數字
ret = obj.search('abc123eeee') # 正則表達式對象調⽤search, 參數爲待匹配的字符串
print(ret.group()) # 結果: 123
obj = re.compile(r'(?P<id>\d+)(?P<name>e+)') # 從正則表達式匹配的內容每一個組起名
字
ret = obj.search('abc123eeee') # 搜索
print(ret.group()) # 結果: 123eeee
print(ret.group("id")) # 結果: 123 # 獲取id組的內容
print(ret.group("name")) # 結果: eeee # 獲取name組的內容
注意:
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 這是由於findall會優先把匹配結果組裏內容返回,若是想要匹
配結果,取消權限便可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
ret=re.split("\d+","eva3egon4yuan")
print(ret) #結果 : ['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #結果 : ['eva', '3', 'egon', '4', 'yuan']
#在匹配部分加上()以後所切出的結果是不一樣的,
#沒有()的沒有保留所匹配的項,可是有()的卻可以保留了匹配的項,
#這個在某些須要保留匹配部分的使用過程是很是重要的python