Python3.8_正則表示式
阿新 • • 發佈:2021-07-22
以下內容來源於老男孩
正則表示式定義和作用
#正則表示式是什麼?
它是約束字串匹配某種形式的規則
#正則表示式有什麼用?
1.檢測某個字串是否符合規則.比如:判斷手機號,身份證號是否合法
2.提取網頁字串中想要的資料.比如:爬蟲中,提取網站天氣,資訊,股票程式碼,星座運勢等具體關鍵字
#線上測試工具 http://tool.chinaz.com/regex/
正則表示式所包含的元素種類
#正則表示式由一些 [普通字元] 和一些 [元字元] 組成: (1)普通字元包括大小寫字母和數字 (2)元字元具有特殊含義,大體種類分為如下: 1.預定義字符集,字元組 2.量詞 3.邊界符 4.分組
(一) 匹配單個字元 => [元字元] 預定義字符集
預定義字符集 | 匹配內容 |
---|---|
. | 匹配任意字元,除了換行符\n |
\d | 匹配數字 |
\D | 匹配非數字 |
\w | 匹配字母或數字或下劃線 (正則函式中,支援中文的匹配) |
\W | 匹配非字母或數字或下劃線 |
\s | 匹配任意的空白符 |
\S | 匹配任意非空白符 |
\n | 匹配一個換行符 |
\t | 匹配一個製表符 |
[] | 匹配中括號內列舉的字元 |
字元組格式 | 說明 [預設必須從字元組中選一個] |
---|---|
[...] | 匹配字元組中的字元 |
[^...] | 匹配除了字元組內所有內容,之外的所有字元 |
字元組內容 | 待匹配字元 | 匹配結果 | 說明 |
---|---|---|---|
[0123456789] | 8 | True | 字元組裡列舉的各種字元,必須滿足一個,否則返回假,不匹配 |
[abcdefg] | 9 | False | 由於字元組中沒有"9"字元,所以不匹配 |
[0-9] | 7 | True | 可用 - 表示範圍,[0-9] 和 [0123456789]是一個意思 |
[a-z] | s | True | [a-z]匹配所有的小寫字母 |
[A-Z] | B | True | [A-Z]就表示所有的大寫字母 |
[0-9a-fA-F] | e | True | 可以匹配數字,大小寫形式的a-f. 該正則可驗證十六進位制 |
(二) 匹配多個字元 => [元字元] 量詞符號
量詞 | 用法說明 |
---|---|
? | 重複0次或1次 |
+ | 重複1次或多次 (至少1次) |
* | 重複0次或多次 (任意次) |
{n} | 重複n次 |
{n,} | 重複n次或更多次 (至少n次) |
{n,m} | 重複n到m次 |
.* .+ | 貪婪模式匹配 |
.*? .+? | 非貪婪模式匹配 |
# 貪婪匹配: 預設向更多次數匹配 (底層用的是回溯演算法)
# 非貪婪匹配: 預設向更少次數匹配 (量詞的後面加?號)
(1)量詞( * ? + {} )加上問號?表示非貪婪 惰性匹配
(2)例:.*?w 表示匹配任意長度任意字元遇到一個w就立即停止
(三) 匹配開頭結尾 => [元字元] 邊界符號
邊界符 | 說明 |
---|---|
\b | 匹配一個字元的邊界 |
^ | 匹配字串的開始 |
$ | 匹配字串的結尾 |
(四) 匹配分組 => [元字元] 分組符號
分組 | 用法說明 |
---|---|
a|b | 匹配字元a 或 字元b (如果兩個當中有重合部分,把更長的那個放前面) |
(ab) | 匹配括號內的表示式 ,將()作為一個分組 |
\num | 引用分組num匹配到的字串 |
(?P |
給分組命名 |
(?P=name) | 引用別名: 把name分組所匹配到的內容引用到這裡 |
# ###分組
# 1.正常分組 ()
1) 正常情況下用()圓括號進行分組 可以用\1 反向引用第一個圓括號匹配的內容。
2) (?:正則表示式) 表示取消優先顯示的功能
(正則表示式) 代表分組 findall 把所有分組的內容顯示到列表裡
(?:正則表示式) 代表分組 findall 把所有分組的內容不顯示到列表裡
# 2.命名分組
3) (?P<組名>正則表示式) 給這個組起一個名字
4) (?P=組名) 引用之前組的名字,把該組名匹配到的內容放到當前位置
(五) 正則表示式修飾符
常用修飾符 | 說明 |
---|---|
re.I | 使匹配對大小寫不敏感 |
re.M | 使每一行都能夠單獨匹配(多行匹配),影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內的所有字元 |
正則相關函式
findall 匹配字串中相應內容,返回列表 [用法: findall("正則表示式","要匹配的字串")]
search 通過正則匹配出第一個物件返回,通過group取出物件中的值
match 驗證使用者輸入內容
split 切割
sub 替換
subn 替換
finditer 匹配字串中相應內容,返回迭代器
compile 指定一個統一的匹配規則
練習
# 字元組練習
# print(re.findall('a[abc]b','aab abb acb adb'))
# print(re.findall('a[0123456789]b','a1b a2b a3b acb ayb'))
# print(re.findall('a[abcdefg]b','a1b a2b a3b acb ayb adb'))
# print(re.findall('a[ABCDEFG]b','a1b a2b a3b aAb aDb aYb'))
# print(re.findall('a[0-9a-zA-Z]b','a-b aab aAb aWb aqba1b'))
# print(re.findall('a[0-9][*#/]b','a1/b a2b a29b a56b a456b'))
# print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd"))
# 量詞練習
'''1) ? 匹配0個或者1個a '''
print(re.findall('a?b','abbzab abb aab'))
'''2) + 匹配1個或者多個a '''
print(re.findall('a+b','b ab aaaaaab abb'))
'''3) * 匹配0個或者多個a '''
print(re.findall('a*b','b ab aaaaaab abbbbbbb'))
'''4) {m,n} 匹配m個至n個a '''
print(re.findall('a{1,3}b','aaab ab aab abbb aaz aabb'))
# 貪婪匹配 與 非貪婪匹配 [語法:量詞的後面加?號]
print(re.findall('a.*b','aab ab aaaaab a!!!@#$bz'))
print(re.findall('a.*?b','aab ab aaaaab a!!!@#$bz')) #
# 邊界符練習 \b ^ $
strvar = "大哥大嫂大爺"
print(re.findall('大.',strvar))
print(re.findall('^大.',strvar))
print(re.findall('大.$',strvar))
print(re.findall('^大.$',strvar))
print(re.findall('^大.*?$',strvar))
print(re.findall('^大.*?大$',strvar))
print(re.findall('^大.*?爺$',strvar))
print(re.findall('^g.*? ' , 'giveme 1gfive gay'))
print(re.findall('five$' , 'aassfive'))
print(re.findall('^giveme$' , 'giveme'))
# print(re.findall('^giveme$' , 'giveme giveme'))
# print(re.findall('giveme' , 'giveme giveme'))
# print(re.findall("^g.*e",'giveme 1gfive gay'))
# 分組練習(用圓括號)
print(re.findall('.*?_good','wusir_good alex_good secret男_good'))
print(re.findall('(.*?)_good','wusir_good alex_good secret男_good'))
print(re.findall('(?:.*?)_good','wusir_good alex_good secret男_good'))
# | 代表或 , a|b 匹配字元a 或者 匹配字元b . 把字串長的寫在前面,字串短的寫在後面
# 匹配小數
# 匹配小數和整數
# 匹配135或171的手機號
# 匹配www.baidu.com 或者 www.oldboy.com
# "5*6-7/3" 匹配 5*6 或者 7/3
以上僅個人觀點,僅供參考,如需轉載,請標明出處!!!!