14 正規表示式

2021-08-20 14:08:55 字數 4621 閱讀 9924

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...