1.正規表示式的概念
正規表示式所面向的問題
1)判斷乙個字串是否匹配給定的格式
判斷使用者註冊賬號是否滿足格式
2) 從字串中按指定格式提取資訊
抓取頁面中的鏈結
例:1)判斷郵箱格式是否正確
使用r'^[a-za-z0-9]+@[a-za-z0-9]+\.com$'
import re #匯入re模組,稍後會講
s1 = re.findall(r'^[a-za-z0-9]+@[a-za-z0-9]+\.com$','[email protected]')
print(s1) #返回列表['[email protected]']
s2 = re.findall(r'^[a-za-z0-9]+@[a-za-z0-9]+\.com$','[email protected]')
print(s2) #返回列表['[email protected]']
s3 = re.findall(r'^[a-za-z0-9]+@[a-za-z0-9]+\.com$','10086qq.com')
print(s3) #匹配失敗 返回空列表
s4 = re.findall(r'^[a-za-z0-9]+@[a-za-z0-9]+\.com$','[email protected]')
print(s4) #匹配失敗 返回空列表
2)抓取頁面中特定的資料
import re
html ="""
"""a = re.findall(r'',html)
print(a) #輸出['10086', '10010']
2.re模組
在python中需要通過正規表示式對字串進行匹配的時候,可以使用乙個模組來操作,名字為re
匯入:import re
方法:1)findall方法:在字串中找到正規表示式所匹配的所有子串,並返回乙個列表,如果沒有找到匹配的,則返回 空列表
import re
a = re.findall('python','i love python,python3 is 666')
print(a) #輸出['python','python']
2)search方法:re.search 掃瞄整個字串,匹配成功 返回的是乙個匹配物件(這個物件包含了我們匹配的資訊)
注意:search只能匹配到從頭開始的第乙個,找到符合規則的就返回,不會一直往後找
import re
a = re.search('python','i love python,python3 is 666')
print(a) #輸出<_sre.sre_match object; span=(7, 13), match='python'>
3)match方法:re.match 嘗試從字串的
起始位置匹配乙個模式,匹配成功 返回的是乙個匹配物件(這個物件 包含了我們匹配的資訊),如果不是起始位置匹配成功的話,match()返回的是空,
注意:match只能匹配到乙個
import re
a = re.match('python','python3 is 666')
b = re.match('is','python3 is 666')
print(a) #<_sre.sre_match object; span=(0, 6), match='python'>
print(a.group(),a.span()) #python (0,6)
print(b) #none
3.元字元
單字元匹配
字元功能
.匹配任意乙個字元(除了\n)
匹配[ ]中列舉的字元
\d
匹配數字,即0-9
\d匹配非數字
\s匹配空白,即 空格,tab鍵
\s匹配非空格
\w匹配單詞字元,即a-z,a-z,0-9,_
\w匹配非單詞字元
import re #習慣性加'r',如下所示
a = re.findall(r'.','python3 is great') #['p', 'y', 't', 'h', 'o', 'n', '3', ' ', 'i', 's', ' ', 'g', 'r', 'e', 'a', 't']
b = re.findall(r'\d','python3 is great') #['3']
c = re.findall(r'\s','python3 is great') #[' ',' ']
d = re.findall(r'[a-z]','python3') #['p', 'y', 't', 'h', 'o', 'n']
e = re.findall(r'[a-z][0-9]','python3') #['n3'] (第乙個字元是字母,第二個是數字
代表數量的元字元
字元功能
*匹配前乙個字元出現0次或者n次
+匹配前乙個字元出現1次或者n次
?匹配前乙個字元出現0次或1次
匹配前乙個字元出現m次
匹配前乙個字元至少出現m次
匹配前乙個字元出現從m到n次
import re
a = re.findall(r'3*','python3') #['', '', '', '', '', '', '3', ''] 'p'不是'3',相當於0次
b = re.findall(r'3+','python3 is python3') #['3', '3']
c = re.findall(r'p?','python3') #['p', '', '', '', '', '', '', '']
d = re.findall(r'p','ppython3 is perfect') #['pp']
表示邊界的元字元
字元功能
^匹配字串開頭
$匹配字串結尾
\b匹配乙個單詞的邊界
\b匹配非單詞邊界
import re
a = re.findall(r'^py','python3') #['py']
b = re.findall(r'^py','12 py') #
c = re.findall(r'n3$','python3') #['n3']
d = re.findall(r'\bpy','python3 is good') #['py'] (單詞以'py'為邊界)
分組匹配
字元功能
|匹配左右任意乙個表示式(或運算)
(ab)
將括號中字元作為乙個分組(整體)
\num
引用分組num匹配到的字串
(?p)
分組起別名
(?p=name)
引用別名為name分組匹配到的字串
import re
s = "[email protected]"
p = r"(\w)@(163|qq|gmail|126)\.(com)" #括號內是乙個整體
print(re.match(p,s).group()) #[email protected]
print(re.match(p,s).group(1)) #beiqiu
import re
s = '
'p = r"<(?p.+)><(?p.+)>(.+)" #重新命名並引用
print(re.match(p,s).group('key1')) #html
print(re.match(p,s).group('key2')) #h1
4.貪婪和非貪婪
正則預設都是用貪婪模式去匹配資料的,就是盡可能多的匹配符合要求的資料
在非貪婪模式下,始終找最短匹配
import re
s1 = '
'p1 = r"<.*>"
p2 = r"<.*?>"
print(re.match(p1,s1).group()) #
print(re.match(p2,s1).group()) #s2 = '-123456789-'
p3 = r'-(\d+)(.+-)'
p4 = r'-(\d+?)(.+-)'
print(re.match(p3,s2).group(1),re.match(p3,s2).group(2)) #12345678 9-
print(re.match(p4,s2).group(1),re.match(p4,s2).group(2)) #1 23456789-
14種 正規表示式
使用者名稱正則,4到16位 字母,數字,下劃線,減號 var upattern a za z0 9 輸出 true console.log upattern.test caibaojian 密碼強度正則,最少6位,包括至少1個大寫字母,1個小寫字母,1個數字,1個特殊字元 var ppattern ...
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...