正則表達式
正則表達式
概念:又稱規則表達式,常用來描述、匹配、替換符合某個句法規則的字符串。
理解:特殊字符———>規則———->過濾字符串
目的:1.匹配給定的字符串,2.從字符串中過濾出我們需要的特定部分
Python re模塊
re模塊是python獨有的匹配字符串的模塊,該模塊中提供的很多功能是基於正則表達式實現的,而正則表達式是對字符串進行模糊匹配,提取自己需要的字符串部分,他對所有的語言都通用。
- re模塊是python獨有的
- 正則表達式所有編程語言都可以使用
- re模塊、正則表達式是對字符串進行操作
注意點:正則表達式會對特殊字符進行轉義,如果要保持原模樣,只需加個r前綴。例如:r'\thello-\rworld'
禁止轉義!反斜杠不會被任何特殊方式處理。
Python編譯器用『\』(反斜杠)來表示字符串常量中的轉義字符。
如果反斜杠後面跟着一串編譯器能夠識別的特殊字符,那麼整個轉義序列將被替換成對應的特殊字符(例如,『\n』將被編譯器替換成換行符)
本質上來講,使用r,你在告訴編譯器完全不要去干涉你的字符串
常見轉義符
元字符
元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。
字符 | 說明 |
---|---|
. | 匹配除換行符以外的所有字符 |
[…] | 匹配字符集 |
\w | 匹配字母、數字及下劃線_ ,等價於[A-Za-z0-9_] |
\W | 匹配所有與\w不匹配的字符(取反) |
\s | 匹配單個空格符、包括tab鍵和換行符 |
\S | 匹配除單個空格之外的字符 |
\d | 匹配從0到9的數字,等價於[0-9] |
\D | 匹配非數字 |
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結尾的位置 |
限定符(重複)
限定符用來限定一個目標子表達式要重複出現多少次才匹配成功
限定符 | 說明 |
---|---|
* | 匹配前面的字符0次或多次 |
+ | 匹配前面的字符1次或多次 |
? | 匹配前面的字符0次或1次 |
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字符至少n次 |
{n,m} | 匹配前面的字符至少n次,最多m次 |
字符串轉義:\
www.baidu.com
www\.baodu\.com
貪婪與非貪婪
貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結果就好,最少的匹配字符。
默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。
字符 | 說明 |
---|---|
* | 允許前一個字符可以出現0次或者無數次 |
+ | 前一個字符至少出現1次 |
? | 前一個字符只能出現一次或者不出現 |
{n} | 允許前一個字符只能出現n次 |
{n,m} | 允許前一個字符出現n到m次 |
{n, } | 允許前一個字符至少出現n次 |
轉義符
轉義字符 | 描述 |
---|---|
\(在行尾時) |
續行符 |
\\ |
反斜杠符號 |
\' |
單引號 |
\" |
雙引號 |
\a |
響鈴 |
\b |
退格(Backspace) |
\e |
轉義 |
\000 |
空 |
\n |
換行 |
\v |
縱向製表符 |
\t |
橫向製表符 |
\r |
回車 |
\f |
換頁 |
\oyy |
八進制數,例如:\o12 代表換行 |
\xyy |
十進制數,例如:\x0a 代表換行 |
\other |
其他的字符以普通格式輸出 |
標誌位
標誌 | 說明 |
---|---|
re.S | 匹配包括換行在內的所有字符 |
re.I | 使匹配對大小寫不敏感 |
re.L | 做本地化識別(locale-aware)匹配,法語等 |
re.M | 多行匹配,影響^和$ |
re.X | 該標誌通過給予更靈活的格式以便將正則表達式寫得更易於理解 |
re.U | 根據Unicode字符集解析字符,這個標誌影響\w,\W,\b,\B |
-
re.I 使匹配對大小寫不敏感,如下:
# re.I 的學習,忽略大小寫 S1 = 'CoN' #定義字符串i1 S2 = 'www.xiao.con' #定義字符串i2 #print(re.search('CoN','www.xiao.con').group()) #區分大小寫的子組輸出,報有錯 print(re.search(S1,S2,re.I).group()) #不區分大小寫的子組輸出 # con
-
re.M 使用^ 和 $ 符號,實現多行多行匹配。如將所有行的末尾字符串輸出得:
# re.M 的學習,將所有行的尾字母或者首部輸出 S3 = '''I am girl you are boy we are friends ''' #定義初始字符串 print(re.findall(r"\w+$",S3,re.M)) #輸出S3的每行最後一個字符串 # ['girl', 'boy', 'friends']
-
re.S匹配包括換行在內的所有字符。如下:
s1 = '''jduedhhelloworld: 11630 passgrthgdg ''' #初始字符串,有換行所以用三引號 b = re.findall('hello(.*?)pass',s1) #findal返回字符串中某個正則表達式模式全部的非重複出現的情況,不包含換行,返回列表 c = re.findall('hello(.*?)pass',s1,re.S) #包含換行 print('b is',b) #輸出B匹配的結果 b is [] print('c is',c) #輸出C,包行匹配輸出的結果 c is ['world: \n 11630\n ']
正則表達式常用函數
1、re.findall()
函數
語法:re.findall(pattern, string, flags=0)
——> list(列表)
pattern 匹配的正則表達式
string 要匹配的字符串。
flags 標誌位,用於控制正則表達式的匹配方式
列出字符串中模式的所有匹配項,並作為一個列表返回。如果無匹配,則返回空列表!
import re
print(re.findall(r"ab","abcaaaab"))
['ab', 'ab'] #匹配的值作為一個列表範圍
2、re.compile()
函數
語法:re.compile(pattern, flags=0)
——> pattern object
根據包含正則表達式的字符串創建模式對象,可以實現更有效率地匹配!用了re.compile以後,正則對象會得到保留,這樣在需要多次運用這個正則對象的時候,效率會有較大的提升
import re
s=r"^010-\d{8}$"
print(re.findall(s,"010-12345678"))
# ['010-12345678']
p_tel=re.compile(s) #對s這個正則表達式創建模式對象p_tel
print(p_tel)
# <_sre.SRE_Pattern object at 0x7f3ab3776d78>
print(p_tel.findall("010-12345678"))
#經過compile轉換的正則表達式對象也能用於普通的re函數,跟上面的re.findall(s,"010-12345678")一樣的效果
# ['010-12345678']
3、re.match()
函數
語法:re.match(pattern, string, flags=0)
——> match object or None
在字符串的開始位置匹配正則!如果無匹配,則返回 None 。
import re
s=r"abc"
com=re.compile(s)
com.match("abcdef") #abc在開始的位置,可以匹配
# <_sre.SRE_Match object at 0x7f3ab3480cc8>
print(com.match("hhhabc")) #abc不在開始的位置,不可以匹配
# None
# 使用group()-返回匹配的數據
com.match("abcddddd").group() #使用group()返回匹配的對象
# 'abc'
4、re.search()
函數
語法:re.search(pattern, string, flags=0)
——> match object or None
re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然後返回,如果字符串沒有匹配,則返回None
re.match與re.search的區別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。
5、re.sub()
函數
語法:re.sub(pattern, repl, string, count=0, flags=0)
——> string
將字符串中所有 pattern 的匹配項用 repl 替換!
import re
re.sub(r"abc","123","abcdefabc")
# '123def123'
6、re.split()
函數
語法:re.split(pattern, string, maxsplit=0, flags=0)
——> list
根據模式的匹配項來分割字符串
import re
re.split(r"\d+","aa11bb22cc") #以正則表達式\d+為分割符
['aa', 'bb', 'cc']
re.split(r"\d","aa11bb22cc") #以正則表達式\d+為分割符
['aa', '', 'bb', '', 'cc']