1. 程式人生 > 其它 >python正則表示式學習筆記

python正則表示式學習筆記

技術標籤:學習筆記正則表示式python

python正則表示式學習筆記

import re包

match方法:

re.match(pattern,string,flag=0)

引數功能
patter匹配的正則表示式
flags需要匹配的字串
flags

flag引數

修飾符描述
re.I區分大小寫
re.L做本地化識別匹配
re.M多行匹配影響^,$
re.S使.匹配包括換行在內的所有字元
re.U根據Unicode字符集解析字元,影響\w \W \b \B
re.X該標誌通過給予更靈活的格式將正則表示式寫的更容易理解

如果匹配成功會返回一個匹配成功的物件,如果沒有匹配上則返回None
例:

import
re s='hello python' pattern1='hello' pattern2='Hello' S1=re.match(pattern1,s) S2=re.match(pattern2,s) S3=re.match(pattern2,s,flags=re.I)#不區分大小寫匹配 print(S1) print(S2) print(S3) print(dir(S1))#檢視當物件的方法 print(S1.group())#返回匹配的字串 print(S1.span())#匹配的範圍 print(S1.start())#匹配的首位

常用匹配符

符號描述
.匹配任意字元,除了\n
[]匹配列表中字元
\w匹配字母、數字、下劃線
\W匹配不是數字、字母、下劃線
\s匹配空白字元(\n,\t)
\S匹配空白字元
\d匹配數字
\D匹配數字

例:

import re

print('-----------.的使用-----------')
s1='a'
s2='A'
s3='1'
s4='_'
s5='\n'
pattern='.'
S1=re.match(pattern,s1)
S2=re.match(pattern,s2)
S3=re.match(pattern,s3)
S4=re.match(pattern,s4)
S5=re.match(pattern,s5)
print('小寫字母:'
,S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\d的使用-----------') pattern='\d' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\D的使用-----------') pattern='\D' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\s的使用-----------') pattern='\s' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\S的使用-----------') pattern='\S' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\w的使用-----------') pattern='\w' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\W的使用-----------') pattern='\W' S1=re.match(pattern,s1) S2=re.match(pattern,s2) S3=re.match(pattern,s3) S4=re.match(pattern,s4) S5=re.match(pattern,s5) print('小寫字母:',S1,'\n','大寫字母',S2,'\n','數字:',S3,'\n','下劃線:',S4,'\n','空白字元:',S5) print('-----------\\[]的使用-----------') pattern='[2468]' s2='2' s6='6' s9='9' S2=re.match(pattern,s2) S6=re.match(pattern,s6) S9=re.match(pattern,s9) print('pattern=[2468]\n','2:',S1,'\n','6',S2,'\n','9:',S3)

返回結果:

-----------.的使用-----------
小寫字母: <re.Match object; span=(0, 1), match='a'> 
 大寫字母 <re.Match object; span=(0, 1), match='A'> 
 數字: <re.Match object; span=(0, 1), match='1'> 
 下劃線: <re.Match object; span=(0, 1), match='_'> 
 空白字元: None
-----------\d的使用-----------
小寫字母: None 
 大寫字母 None 
 數字: <re.Match object; span=(0, 1), match='1'> 
 下劃線: None 
 空白字元: None
-----------\D的使用-----------
小寫字母: <re.Match object; span=(0, 1), match='a'> 
 大寫字母 <re.Match object; span=(0, 1), match='A'> 
 數字: None 
 下劃線: <re.Match object; span=(0, 1), match='_'> 
 空白字元: <re.Match object; span=(0, 1), match='\n'>
-----------\s的使用-----------
小寫字母: None 
 大寫字母 None 
 數字: None 
 下劃線: None 
 空白字元: <re.Match object; span=(0, 1), match='\n'>
-----------\S的使用-----------
小寫字母: <re.Match object; span=(0, 1), match='a'> 
 大寫字母 <re.Match object; span=(0, 1), match='A'> 
 數字: <re.Match object; span=(0, 1), match='1'> 
 下劃線: <re.Match object; span=(0, 1), match='_'> 
 空白字元: None
-----------\w的使用-----------
小寫字母: <re.Match object; span=(0, 1), match='a'> 
 大寫字母 <re.Match object; span=(0, 1), match='A'> 
 數字: <re.Match object; span=(0, 1), match='1'> 
 下劃線: <re.Match object; span=(0, 1), match='_'> 
 空白字元: None
-----------\W的使用-----------
小寫字母: None 
 大寫字母 None 
 數字: None 
 下劃線: None 
 空白字元: <re.Match object; span=(0, 1), match='\n'>
-----------\[]的使用-----------
pattern=[2468]
 2: None 
 6 <re.Match object; span=(0, 1), match='2'> 
 9: None

***Repl Closed***

匹配多個字元:

符號描述符號描述
*匹配次或{m}重複m次
+匹配次或{m,n}重複m~n任意次
?匹配次或{m,}重複至少m次

例1:
匹配手機號碼

import re
#匹配手機號碼
#pattern_phone_number='\d\d\d\d\d\d\d\d\d\d'#笨辦法
#pattern_phone_number='1[25789]\d\d\d\d\d\d\d\d'#聰明一兜兜
pattern_phone_number='1[25789]\d{9}'#機智``
phone_number='18756578254'#放心這不是我手機號☺

result=re.match(pattern_phone_number,phone_number)
print(result)

#輸出
#<re.Match object; span=(0, 11), match='18756578254'>
#[Finished in 0.5s]

例2:
匹配首字元是大寫字元後面都是小寫字元,並且小寫字元可有可無。

import re
text="Hello guy,my name is k_i_k_i what's your name?"
pattern='[A-Z][a-z]*'
o=re.match(pattern,text)
print(o)
#<re.Match object; span=(0, 5), match='Hello'>
#[Finished in 0.2s]

例3:
匹配符合要求的變數名(字母、數字、下劃線,且數字不能開頭)

import re
s1="1name"
s2="name1"
s3="_name1"
pattern='[A-Za-z_]\w*'#='[A-Za-z_][a-zA-Z_0-9]]*'
S1=re.match(pattern,s1)
S2=re.match(pattern,s2)
S3=re.match(pattern,s3)
print(S1,'\n',S2,'\n',S3,'\n')

#None 
 #<re.Match object; span=(0, 5), match='name1'> 
 #<re.Match object; span=(0, 6), match='_name1'> 
#[Finished in 0.2s]

例3:
匹配1-99的數字

import re
s1="0"
s2="09"
s3="105"
s4="6"
pattern='[1-9]\d?'
S1=re.match(pattern,s1)
S2=re.match(pattern,s2)
S3=re.match(pattern,s3)
S4=re.match(pattern,s4)
print(S1,'\n',S2,'\n',S3,'\n',S4,'\n')

例3:
匹配8-20位的隨機密碼

import re
s1="12347sdabf#"
s2="fnsd24_3284df"
s3="fdslkndskfkdsjnvfsangvsagffesf"
s4="afes"
pattern='\w{8,20}'
S1=re.match(pattern,s1)
S2=re.match(pattern,s2)
S3=re.match(pattern,s3)
S4=re.match(pattern,s4)
print(S1,'\n',S2,'\n',S3,'\n',S4,'\n')

原生字元的使用

import re
s1="\\\\t123"
s2="\\\\\\\\t123"
pattern=r'\\\\\\\\t\d*'#轉換成原生字串
S1=re.match(pattern,s1)
S2=re.match(pattern,s2)
print(S1,'\n',S2)

邊界字元

$表示結束
例:
匹配QQ郵箱5-10位
錯誤示範:

import re
qq1="[email protected]"
qq2="[email protected]"
pattern="[1-9]\d{4,9}@qq.com"

o1=re.match(pattern,qq1)
o2=re.match(pattern,qq2)
print(o1,'\n',o2)
#<re.Match object; span=(0, 15), match='[email protected]'> 
 #<re.Match object; span=(0, 15), match='[email protected]'>
#[Finished in 0.2s]

qq2明顯不是但還是匹配成功,這時就需要劃分好匹配的結尾
這時便需要使用**$**來劃分正則表示式的結尾。

pattern="[1-9]\d{4,9}@qq.com$"#修改
#<re.Match object; span=(0, 15), match='[email protected]'> 
# None
#[Finished in 0.2s]

^表示開始

import re
word1="hello.py"
word2="python.py"
pattern=r"^hello.*"
o1=re.match(pattern,word1)
o2=re.match(pattern,word2)
print(o1,'\n',o2)
#<re.Match object; span=(0, 8), match='hello.py'> 
# None
#[Finished in 0.2s]

\b表示單詞邊界

import re
word1="123 python1"
word2="123 python"
pattern=r".*python\b"#匹配\B位置不是單詞的邊界
o1=re.match(pattern,word1)
o2=re.match(pattern,word2)
print(o1)
print(o2)
#None
#<re.Match object; span=(0, 10), match='123 python'>
#[Finished in 0.2s]

\B表示非單詞邊界

import re
word1="123 python1"
word2="123 python"
pattern=r".*python\B"#匹配\B位置不是單詞的邊界
o1=re.match(pattern,word1)
o2=re.match(pattern,word2)
print(o1)
print(o2)
#<re.Match object; span=(0, 10), match='123 python'>
#None
#[Finished in 0.2s]

search方法:

re.search(pattern,string,flag=0)

引數功能
patter匹配的正則表示式
flags需要匹配的字串
flags

search與match的區別
match會從字串開頭開始比較,如果沒有則返回失敗None
search會搜尋整個字串,直到搜到或搜完為止

import re

centence="My name is kiki."
partten="kiki"
match_centence=re.match(partten,centence)
search_centence=re.search(partten,centence)

print("match:",match_centence)
print("search:",search_centence)
#match: None
#search: <re.Match object; span=(11, 15), match='kiki'>
#[Finished in 0.2s]

匹配多個字串:
使用 **|**相當於或

import re

centence1="My name is kiki."
centence2="Her name is yoki."
centence3="Her name is niki."
partten="kiki|yoki|niki|biki"
search_centence1=re.search(partten,centence1)
search_centence2=re.search(partten,centence2)
search_centence3=re.search(partten,centence3)

print("search1:",search_centence1)
print("search2:",search_centence2)
print("search3:",search_centence3)
'''
search1: <re.Match object; span=(11, 15), match='kiki'>
search2: <re.Match object; span=(12, 16), match='yoki'>
search3: <re.Match object; span=(12, 16), match='niki'>
[Finished in 0.2s]'''

例:
匹配0-100之間的所有數字

import re

num1='100'
num2='0'
num3='10000'
num4='06'
pattern=r'[1-9]?\d$|100$'
match_num1=re.match(pattern,num1)
match_num2=re.match(pattern,num2)
match_num3=re.match(pattern,num3)
match_num4=re.match(pattern,num4)
print(match_num1)
print(match_num2)
print(match_num3)
print(match_num4)
#<re.Match object; span=(0, 3), match='100'>
#<re.Match object; span=(0, 1), match='0'>
#None
#None
#[Finished in 0.3s]

|與[]的差異

import re

kiki='kiki'
yoki='yoki'
yiki='yiki'
pattern1=r'[ky][io]ki'
pattern2=r'kiki|yoki'
o1=re.match(pattern1,kiki)
o2=re.match(pattern1,yoki)
o3=re.match(pattern1,yiki)
o4=re.match(pattern2,kiki)
o5=re.match(pattern2,yoki)
o6=re.match(pattern2,yiki)#匹配不了yiki
print(o1)
print(o2)
print(o3)
print(o4)
print(o5)
print(o6)
'''
<re.Match object; span=(0, 4), match='kiki'>
<re.Match object; span=(0, 4), match='yoki'>
<re.Match object; span=(0, 4), match='yiki'>
<re.Match object; span=(0, 4), match='kiki'>
<re.Match object; span=(0, 4), match='yoki'>
None
[Finished in 0.3s]
'''

分組

在這裡插入圖片描述
例:
匹配座機號碼(010-233333,0432-5205201 (3-4)-(5-8))

import re

phone_num1='011-233520'
phone_num2='011233520'
pattern=r'(\d{2,3})-(\d{5,8})'
o1=re.match(pattern,phone_num1)
o2=re.match(pattern,phone_num2)
print(o1.groups())
print(o1.group(1))
print(o1.group(2))
print(o1.groups()[0])
print(o1.groups()[1])
print(o2)
'''
('011', '233520')
011
233520
011
233520
None
[Finished in 0.2s]'''

例:
匹配網頁資料(分組)

import re

ht='<html><head>網頁標題</head></html>'
ht_flase='<html><head>網頁標題</head></body>'
pattern=r'<(.+)><(.+)>.+</\2></\1>'
o1=re.match(pattern,ht)
o2=re.match(pattern,ht_flase)
print(o1)
print(o2)
'''<re.Match object; span=(0, 30), match='<html><head>網頁標題</head></html>'>
None
[Finished in 0.2s]'''

取別名

import re

ht='<html><head>網頁標題</head></html>'
ht_flase='<html><head>網頁標題</head></body>'
pattern=r'<(?P<kiki_html>.+)><(?P<kiki_head>.+)>.+</(?P=kiki_head)></(?P=kiki_html)>'
o1=re.match(pattern,ht)
o2=re.match(pattern,ht_flase)
print(o1)
print(o2)
'''<re.Match object; span=(0, 30), match='<html><head>網頁標題</head></html>'>
None
[Finished in 0.2s]'''

sub和subn搜尋與替換
re.sub(pattern,repl,string,count=0,flags=0)
re.subn(pattern,repl,string,count=0,flags=0)

將外國電話轉換成中國的“111-111-111-111#這是外國的字串”->“111111111111”

import re
print("----------sub---------")
phone="111-111-111-111#這是外國的字串"
#①將#----替換
pattern="#.*$"
phone=re.sub(pattern,"",phone)
print(phone)
pattern=r"\D"
phone=re.sub(pattern,"",phone)
print(phone)
print("----------subn---------")
phone="111-111-111-111#這是外國的字串"
#subn返回了一個元組第一項是替換後的數值,第二項是替換的次
#①將#----替換
pattern="#.*$"
phone=re.subn(pattern,"",phone)
print(phone)
pattern=r"\D"
phone=re.subn(pattern,"",phone[0])
print(phone)'''----------sub---------
111-111-111-111
111111111111
----------subn---------
('111-111-111-111', 1)
('111111111111', 3)
[Finished in 0.2s]'''

comple:

import re
s='my name is kiki233'
pattern=r'\D+'
regex=re.compile(pattern)
o=regex.match(s)
print(o)
'''<re.Match object; span=(0, 15), match='my name is kiki'>
[Finished in 0.2s]'''

findall:
返回列表

import re
s='my name is kiki233'
pattern=r'\w+'
o=re.findall(pattern,s)
print(o)
'''['my', 'name', 'is', 'kiki233']
[Finished in 0.3s]'''

finditer:
返回迭代器

import re
s='my name is kiki233'
pattern=r'\w+'
o=re.finditer(pattern,s)
print(o)
for i in o:
	print(i.group())
'''<callable_iterator object at 0x0000026CBCD16550>
my
name
is
kiki233
[Finished in 0.3s]'''

split:
re.split(patter,string,maxsplit,flags)
在這裡插入圖片描述

import re
s='id1id2id3id4'
pattern=r'[a-z]+'
o=re.split(pattern,s)
print(o)
"""['', '1', '2', '3', '4']
[Finished in 0.3s]"""

貪婪模式和非貪婪模式

貪婪模式,儘可能匹配多的字元
非貪婪模式,儘可能少
預設貪婪

import re
o1=re.match(r'(.+)(\d+-\d+-\d+)','This is kiki\'s phone number: 111-222-333-444')
o2=re.match(r'(.+?)(\d+-\d+-\d+)','This is kiki\'s phone number: 111-222-333-444')

print("貪婪:",o1.groups())
print("非貪婪:",o2.groups())
'''貪婪: ("This is kiki's phone number: 111-22", '2-333-444')
非貪婪: ("This is kiki's phone number: ", '111-222-333')
[Finished in 0.3s]'''

一下午學完了這個,相信明天就忘了☹☹☹