python_re模塊


Python中re模塊主要功能是通過正則表達式是用來匹配處理字符串的

第一步:import re

導入該模塊后,就可以使用該模塊下的所有方法和屬性



1、正則基本概念




^元字符   以什么開頭

import  re
str="匹配規則這個字符串是否匹配"
print(re.findall("^匹配規則",str)) #字符串開始位置與匹配規則符合就匹配且打印匹配內容,否則不匹配,返回值是list

打印內容:['匹配規則']

^元字符   如果寫到[]字符集里就是反取

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("[^a-z]",str)) #反取,匹配出除字母外的字符,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

 $元字符   以什么結尾

 

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("則$",str)) #字符串結束位置與則符合就匹配,否則不匹配,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['']

 

* 元字符   匹配其前面的一個字符0次或多次

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("則*",str)) #星號前面的一個字符可以是0次或多次,返回值是list
print(re.findall("規則*",str)) #星號前面的一個字符可以是0次或多次,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '則則', '', '', '則則則', '']
['規則', '規則則']

+ 元字符   匹配其前面的一個字符1次或多次

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("則+",str)) #加號前面的一個字符可以是1次或多次,返回值是list
print(re.findall("規則+",str)) #加號前面的一個字符可以是1次或多次,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['', '則則', '則則則']
['規則', '規則則']

元字符  匹配其前面的一個字符0次或1次

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("則?",str)) #問號前面的一個字符可以是0次或1次,返回值是list
print(re.findall("規則?",str)) #問號前面的一個字符可以是0次或1次,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['規則', '規則']

{}元字符,范圍

{m}匹配前一個字符m次,{m,n}匹配前一個字符m至n次,若省略n,則匹配m至無限次

{0,}匹配前一個字符0或多次,等同於*元字符
{+,}匹配前一個字符1次或無限次,等同於+元字符
{0,1}匹配前一個字符0次或1次,等同於?元字符

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("則{2}",str)) #匹配前一個字符2次,返回值是list
print(re.findall("規則{1,2}",str)) #匹配前一個字符1-2次,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['則則', '則則']
['規則', '規則則']

[]元字符,字符集

需要字符串里完全符合,匹配規則,就匹配,(規則里的 [] 元字符)對應位置是[]里的任意一個字符就匹配

import  re
str="匹配s規則這s個字符串是否s匹配f規則則re則則則"
print(re.findall("匹配[s,f]規則",str)) #匹配字符后,只有符合[]中任意字符均可,返回值是list

D:\study\python\atp\venv\Scripts\python.exe D:/study/python/atp/lib/t.py
['匹配s規則', '匹配f規則']

 \d 匹配任何十進制數,它相當於類[0-9]

import  re
str="匹配s規則這s個字符串4是否s匹配3f規則則re則則2則"
print(re.findall("\d",str)) #匹配字符串所有的數字,返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
['4', '3', '2']

\d+如果需要匹配一位或者多位數的數字時用

import  re
str="匹配s規則這s個字符串455是否s匹配3f規則則re則則2則"
print(re.findall("\d+",str)) #匹配字符串中一位或多位數字,返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
['455', '3', '2']

\D匹配任何非數字字符,它相當於類[^0-9]

import  re
str="匹配s規則這s個字符串455是否s匹配3f規則則re則則2則"
print(re.findall("\D",str)) #匹配字符串中非數字,返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
['', '', 's', '', '', '', 's', '', '', '', '', '', '', 's', '', '', 'f', '', '', '', 'r', 'e', '', '', '']

\s匹配任何空白字符,它相當於類[\t\n\r\f\v]

import  re
str="匹配s規則這s個字 符 串 \n \t \f \v455是否s匹配3f規則則re則則2則"
print(re.findall("\s",str)) #匹配字符串空白字符(\t\n\r\f\v),返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
[' ', ' ', ' ', '\n', ' ', '\t', ' ', '\x0c', ' ', '\x0b']

\S匹配任何非空白字符,它相當於類[^\t\n\r\f\v]

import  re
str="匹配s規則這s個字 符 串 \n \t \f \v455是"
print(re.findall("\S",str)) #匹配字符串非空白字符(\t\n\r\f\v),返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
['', '', 's', '', '', '', 's', '', '', '', '', '4', '5', '5', '']

\w匹配包括下划線在內任何字母數字漢字字符

import  re
str="匹配s規則這s個_字 S符 串-455是"
print(re.findall("\w",str)) #匹配字符串下划線,漢字,字母,數字,返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
['', '', 's', '', '', '', 's', '', '_', '', 'S', '', '', '4', '5', '5', '']

\W匹配非任何字母數字漢字字符包括下划線在內

import  re
str="匹配s規則這s個_字 S符 串-455是"
print(re.findall("\W",str)) #匹配字符串非下划線,漢字,字母,數字,返回值是list

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/dongyf/Documents/python/besttest_study/ryg.py
[' ', ' ', '-']

()元字符,分組

也就是分組匹配,()里面的為一個組也可以理解成一個整體

如果()后面跟的是特殊元字符如   (adc)*   那么*控制的前導字符就是()里的整體內容,不再是前導一個字符

import  re
str="a3a3ddd"
print(re.search("(a3)+",str).group()) #匹配一個或多個a3

C:\Users\zhaow\AppData\Local\Programs\Python\Python37\python.exe D:/study/python/test/uu.py
a3a3

|元字符,或

|或,或就是前后其中一個符合就匹配

import  re
str="a3死a3d有dd"
print(re.findall(r"死|有+",str)) #匹配|前后一個字符均可

C:\Users\zhaow\AppData\Local\Programs\Python\Python37\python.exe D:/study/python/test/uu.py
['', '']

r原生字符

將在python里有特殊意義的字符如\b,轉換成原生字符(就是去除它在python的特殊意義),不然會給正則表達式有沖突,為了避免這種沖突可以在規則前加原始字符r

 

模塊方法:

match()函數(以后常用)

match,從頭匹配一個符合規則的字符串,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None
match(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式

import  re
str="hello egon bcd egon lge egon acd 19"
r=re.match("h\w+",str) #match,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None,非字母,漢字,數字及下划線分割
print(r.group()) # 獲取匹配到的所有結果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結果,只拿出匹配到的字符串中分組部分的結果
print(r.groupdict())  # 獲取模型中匹配到的分組結果,只拿出匹配到的字符串中分組部分定義了key的組結果

hello
()
{}


r2=re.match("h(\w+)",str) #match,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None
print(r2.group())
print(r2.groups())
print(r2.groupdict())

hello
('ello',)
{}

r3=re.match("(?P<n1>h)(?P<n2>\w+)",str)  #?P<>定義組里匹配內容的key(鍵),<>里面寫key名稱,值就是匹配到的內容
print(r3.group())
print(r3.groups())
print(r3.groupdict())

hello
('h', 'ello')
{'n1': 'h', 'n2': 'ello'}

search()函數
search,瀏覽全部字符串,匹配第一符合規則的字符串,瀏覽整個字符串去匹配第一個,未匹配成功返回None
search(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式

注意:match()函數 與 search()函數基本是一樣的功能,不一樣的就是match()匹配字符串開始位置的一個符合規則的字符串,search()是在字符串全局匹配第一個合規則的字符串

import  re
str="hello egon bcd egon lge egon acd 19"
r=re.search("h\w+",str) #match,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None,非字母,漢字,數字及下划線分割
print(r.group()) # 獲取匹配到的所有結果,不管有沒有分組將匹配到的全部拿出來
print(r.groups()) # 獲取模型中匹配到的分組結果,只拿出匹配到的字符串中分組部分的結果
print(r.groupdict())  # 獲取模型中匹配到的分組結果,只拿出匹配到的字符串中分組部分定義了key的組結果

hello
()
{}


r2=re.search("h(\w+)",str) #match,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None
print(r2.group())
print(r2.groups())
print(r2.groupdict())

hello
('ello',)
{}

r3=re.search("(?P<n1>h)(?P<n2>\w+)",str)  #?P<>定義組里匹配內容的key(鍵),<>里面寫key名稱,值就是匹配到的內容
print(r3.group())
print(r3.groups())
print(r3.groupdict())

hello
('h', 'ello')
{'n1': 'h', 'n2': 'ello'}

findall()函數

findall(pattern, string, flags=0)
# pattern: 正則模型
# string : 要匹配的字符串
# falgs : 匹配模式

瀏覽全部字符串,匹配所有合規則的字符串,匹配到的字符串放到一個列表中,未匹配成功返回空列表

 

注意:一旦匹配成,再次匹配,是從前一次匹配成功,后面一位開始的,也可以理解為匹配成功的字符串,不在參與下次匹配

import re
r=re.findall("\d+\w\d+","a2b3c4d5") #瀏覽全部字符串,匹配所有合規則的字符串,匹配到的字符串方到一個列表中
print(r)

['2b3', '4d5'] #匹配成功的字符串,不再參與下次匹配,所以3c4也符合規則但是沒有匹配到

注意:如果沒寫匹配規則,也就是空規則,返回的是一個比原始字符串多一位的,空字符串列表

import re
r=re.findall("","a2b3c4d5") #瀏覽全部字符串,匹配所有合規則的字符串,匹配到的字符串方到一個列表中
print(r)

['', '', '', '', '', '', '', '', ''] #如果沒有寫匹配規則,也就是空規則,返回的是一個比原始字符串多一位的空字符串列表,如上是8個字符,返回是9個空字符

注意:正則匹配到空字符的情況,如果規則里只有一個組,而組后面是*就表示組里的內容可以是0個或者多過,這樣組里就有了兩個意思,一個意思是匹配組里的內容,二個意思是匹配組里0內容(即是空白)所以盡量避免用*否則會有可能匹配出空字符串

注意:正則只拿組里最后一位,如果規則里只有一個組,匹配到的字符串里在拿組內容是,拿的是匹配到的內容最后一位

import re
r=re.findall("(ca)*","ca2b3caa4d5") #瀏覽全部字符串,匹配所有合規則的字符串,匹配到的字符串方到一個列表中
print(r)

['ca', '', '', '', 'ca', '', '', '', '', '']#用*號會匹配出空字符
無分組:匹配所有合規則的字符串,匹配到的字符串放到一個列表中
import re
r=re.findall("a\w+","ca2b3 caa4d5") #瀏覽全部字符串,匹配所有合規則的字符串,匹配到的字符串方到一個列表中
print(r)
['a2b3', 'aa4d5']#匹配所有合規則的字符串,匹配到的字符串放入列表

有分組:只將匹配到的字符串里,組的部分放到列表里返回,相當於groups()方法

import re
r=re.findall("a(\w+)","ca2b3 caa4d5") #有分組:只將匹配到的字符串里,組的部分放到列表里返回
print(r)
['2b3', 'a4d5']#返回匹配到組里的內容返回

多個分組:只將匹配到的字符串里,組的部分放到一個元組中,最后將所有元組放到一個列表里返

相當於在group()結果里再將組的部分,分別,拿出來放入一個元組,最后將所有元組放入一個列表返回

import re
r=re.findall("(a)(\w+)","ca2b3 caa4d5") #有多分組:只將匹配到的字符串里,組的部分放到一個元組中,最后將所有元組放到一個列表里返回
print(r)
[('a', '2b3'), ('a', 'a4d5')]#返回的是多維數組

分組中有分組:只將匹配到的字符串里,組的部分放到一個元組中,先將包含有組的組,看作一個整體也就是一個組,把這個整體組放入一個元組里,然后在把組里的組放入一個元組,最后將所有組放入一個列表返回

import re
r=re.findall("(a)(\w+(b))","ca2b3 caa4b5") #分組中有分組:只將匹配到的字符串里,組的部分放到一個元組中,先將包含有組的組,看作一個整體也就是一個組,把這個整體組放入一個元組里,然后在把組里的組放入一個元組,最后將所有組放入一個列表返回
print(r)
[('a', '2b', 'b'), ('a', 'a4b', 'b')]#返回的是多維數組
?:在有分組的情況下findall()函數,不只拿分組里的字符串,拿所有匹配到的字符串,注意?:只用於不是返回正則對象的函數如findall()
import re
r=re.findall("a(?:\w+)","a2b3 a4b5 edd") #?:在有分組的情況下,不只拿分組里的字符串,拿所有匹配到的字符串,注意?:只用於不是返回正則對象的函數如findall()
print(r)

['a2b3', 'a4b5']

 

split()函數

根據正則匹配分割字符串,返回分割后的一個列表

split(pattern, string, maxsplit=0, flags=0)

# pattern: 正則模型
# string : 要匹配的字符串
# maxsplit:指定分割個數
# flags  : 匹配模式

 

import  re
r=re.split("a\w","sdfadfdfadsfsfafsff")
print(r)
r2=re.split("a\w","sdfadfdfadsfsfafsff",maxsplit=2)
print(r2)

C:\Users\zhaow\AppData\Local\Programs\Python\Python37\python.exe D:/study/python/atp/lib/t.py
['sdf', 'fdf', 'sfsf', 'sff']
['sdf', 'fdf', 'sfsfafsff']

 sub()函數

替換匹配成功的指定位置字符串

sub(pattern, repl, string, count=0, flags=0)

# pattern: 正則模型
# repl   : 要替換的字符串
# string : 要匹配的字符串
# count  : 指定匹配個數
# flags  : 匹配模式
import  re
r=re.sub("a\w","替換","sdfadfdfadsfsfafsff")
print(r)


C:\Users\zhaow\AppData\Local\Programs\Python\Python37\python.exe D:/study/python/atp/lib/t.py
sdf替換fdf替換sfsf替換sff

subn()函數

替換匹配成功的指定位置字符串,並且返回替換次數,可以用兩個變量分別接受

subn(pattern, repl, string, count=0, flags=0)

# pattern: 正則模型
# repl   : 要替換的字符串
# string : 要匹配的字符串
# count  : 指定匹配個數
# flags  : 匹配模式

 

import  re
a,b=re.subn("a\w","替換","sdfadfdfadsfsfafsff") #替換匹配成功的指定位置字符串,並且返回替換次數,可以用兩個變量分別接受
print(a) #返回替換后的字符串
print(b) #返回替換次數

C:\Users\zhaow\AppData\Local\Programs\Python\Python37\python.exe D:/study/python/atp/lib/t.py
sdf替換fdf替換sfsf替換sff
3

 備注:參考網站 https://www.cnblogs.com/zjltt/p/6955965.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM