Python中re模塊下的函數(shù)詳解
一、re模塊下的函數(shù)
1.re.match()
re.match() 函數(shù)是從頭開始匹配一個符合規(guī)則的字符串,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None。
函數(shù)語法:
re.match(pattern,string,flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
要求:匹配"hello"字符串。
import re result=re.match("hello","hello world") print(result)
輸出結果:
<re.Match object; span=(0, 5), match=‘hello’>
2.re.search()
re.search() 函數(shù)會在整個字符串內(nèi)查找匹配,只要找到第一個匹配然后返回,如果字符串沒有匹配,則返回None。
函數(shù)語法:
re.search(pattern,string,flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
要求:匹配出文章閱讀的次數(shù)。
import re ret = re.search(r"\d+", "閱讀次數(shù)為 9999") print(ret.group())
輸出結果:
9999
3.re.fullmatch()
re.fullmatch() 函數(shù)要求整個字符串完全匹配到正則表達式,就返回一個相應的匹配對象,否則就返回一個None。
函數(shù)語法:
re.fullmatch(pattern, string, flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
要求:匹配出"hello"字符串。
import re result=re.fullmatch("hello","hello world") if result: print(result.group()) else: print("匹配失敗!")
輸出結果:
匹配失敗!
re.match() 、re.search() 和 re.fullmatch()三者區(qū)別
- match()函數(shù)只檢測RE是不是在string的開始位置匹配
- search()函數(shù)會掃描整個string查找匹配
- fullmatch()函數(shù)會掃描整個string是否完全匹配
- match()只有在0位置匹配成功才有返回,如果不是開始位置匹配成功的話,match()則返回none。fullmatch()要整個字符串完全匹配上,從0位置開始到結束位置,如果不是,fullmatch()則返回none。
import re print(re.match('super', 'superstition').span()) print(re.match('super','insuperable'))
輸出結果:
(0, 5) None
import reprint(re.search('super','superstition').span())print(re.search('super','insuperable').span())
輸出結果:
(0, 5) (2, 7)
import re print(re.search('super','superstition').span()) print(re.search('super','insuperable').span())
輸出結果:
None None super
4.re.findall()
re.findall() 函數(shù)在字符串中找到正則表達式所匹配的所有子串,按順序返回一個列表,如果沒有找到匹配的,則返回空列表。
函數(shù)語法:
re.findall(pattern,string,flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
要求:匹配出所有的數(shù)字。
import re print(re.findall(r"\d+","abafa 124ddwa56"))
輸出結果:
[‘124’, ‘56’]
要求:匹配出f開頭且左邊是空字符串的單詞。
import re print(re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest'))
輸出結果:
[‘foot’, ‘fell’, ‘fastest’]
如果有多個組,返回與這些匹配的字符串元組列表。
import re print(re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10'))
輸出結果:
[(‘width’, ‘20’), (‘height’, ‘10’)]
5.re.finditer()
re.finditer() 函數(shù)在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回。
函數(shù)語法:
re.finditer(pattern,string,flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
要求:匹配出所有的數(shù)字。
import re it = re.finditer(r"\d+", "12a32bc43jf3") for match in it: print(match.group())
輸出結果:
12 32 43 3
6.re.split()
re.split() 函數(shù)按照能夠匹配子串將字符串分割后返回列表。
函數(shù)語法:
re.split(pattern, string[, maxsplit=0, flags=0])
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
string | 要匹配的字符串 |
maxsplit | 分隔次數(shù),maxsplit=1分隔一次,默認為0,不限制次數(shù)。 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
用pattern分隔開string。
要求:用非a-zA-Z0-9_字符切分字符串。
import re re.split(r'\W+','Words, words, words.')
輸出結果:
[‘Words’, ‘words’, ‘words’, ‘’]
如果maxsplit非零,最多進行maxsplit分隔,剩下的字符全部返回到列表的最后一個元素。
要求:用非a-zA-Z0-9_字符切分字符串且只分隔一次。
re.split(r'\W+', 'Words, words, words.', 1)
輸出結果:
[‘Words’, ‘words, words.’]
如果pattern中捕獲到括號,那么所有的組里的文字也會包含在列表里。
re.split(r'(\W+)', 'Words, words, words.')
輸出結果:
[‘Words’, ', ', ‘words’, ', ', ‘words’, ‘.’, ‘’]
如果分隔符里有捕獲組合,并且在匹配字符串的開始,那么結果將會以一個空字符串開始,對于結尾也是一樣。
re.split(r'(\W+)', '...words, words...')
輸出結果:
[‘’, ‘…’, ‘words’, ', ', ‘words’, ‘…’, ‘’]
用正則表達式切分字符串比用固定的字符更靈活。
正常的切分代碼:
'a b c'.split(' ')
輸出結果:
[‘a’, ‘b’, ‘’, ‘’, ‘c’]
無法識別連續(xù)的空格,用正則表達式試試:
import re print(re.split(r'\s+','a b c')) #無論多少個空格都可以正常分割。加入, print(re.split(r'[\s\,]+', 'a,b, c d')) #再加入; print(re.split(r'[\s\,\;]+', 'a,b;; c d'))
輸出結果:
[‘a’, ‘b’, ‘c’] [‘a’, ‘b’, ‘c’, ‘d’] [‘a’, ‘b’, ‘c’, ‘d’]
7.re.sub()
re.sub() 函數(shù)用于替換字符串中的匹配項。
函數(shù)語法:
re.sub(pattern, repl, string, count=0, flags=0)
參數(shù)說明如下:
參數(shù) | 描述 |
pattern | 匹配正則表達式 |
repl | 替換的字符串,也可以是一個函數(shù)。 |
string | 要被查找替換的原始字符串。 |
count | 模式匹配后替換的最大次數(shù),默認0表示替換所有的匹配。 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等 |
前三個必選參數(shù),后兩個為可選參數(shù)。
要求:刪除注釋,移除非數(shù)字的內(nèi)容。
import re phone = "2004-959-559 # 這是一個電話號碼" # 刪除注釋 num = re.sub(r'#.*$', "", phone) print("電話號碼 : ", num) # 移除非數(shù)字的內(nèi)容 num = re.sub(r'\D', "", phone) print("電話號碼 : ", num)
輸出結果:
電話號碼 : 2004-959-559
電話號碼 : 2004959559
repl參數(shù)可以是一個函數(shù),正則表達式使用了 (?P…) 語法,將匹配到的數(shù)字部分的字符串命名為value。
要求:將匹配的數(shù)字乘于 2。
import re # 將匹配的數(shù)字乘于 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))
輸出結果:
A46G8HFD1134
8.re.compile()
re.compile() 函數(shù)將正則表達式的樣式編譯為一個正則表達對象(正則對象),可以用于匹配,通過這個對象的方法match(),search()以及其他。
這個表達式的行為可以通過指定標記的值來改變,值可以是以下任意變量。
prog=re.compile(pattern) result=prog.match(string)
等價于
result=re.match(pattern,string)
如果需要多次使用這個正則表達式的話,使用re.compile()和保存這個正則對象以便利用,可以讓程序更加高效。
正則對象的方法和屬性
用compile編譯后的正則表達式對象支持以下方法和屬性:
pattern.search(string[, pos[, endpos]]) 掃描整個string尋找第一個匹配的位置,并返回一個相應的匹配對象。如果沒有匹配,就返回None。
pos參數(shù)可以選擇字符串開始搜索的位置索引,默認為0,它不完全等價于字符串切片,'^'樣式字符匹配字符串真正的開關,和換行符后面的第一個字符,但不會匹配索引 規(guī)定開始的位置。
可選的參數(shù)endpos限定了字符串搜索的結束,它假定字符串長度到endpos,所以只有從pos到endpos-1的字符會被匹配,如果endpos小于pos,就不會有匹配產(chǎn)生,另個,如果rx是一個編譯后的正則對象,rx.search(string,0,50) 等價于rx.search(string[:50],0)。
import re pattern=re.compile("o") print(pattern.search("dog")) print(pattern.search("dog",2))
輸出結果:
<re.Match object; span=(1, 2), match=‘o’> None
- pattern.match(string[, pos[, endpos]]) 如果 string 的 開始位置 能夠找到這個正則樣式的任意個匹配,就返回一個相應的 匹配對象。如果不匹配,就返回 None。
pos參數(shù)可以選擇字符串開始搜索的位置索引,默認為0,它不完全等價于字符串切片,'^'樣式字符匹配字符串真正的開關,和換行符后面的第一個字符,但不會匹配索引 規(guī)定開始的位置。
import re pattern=re.compile("o") print(pattern.match("dog")) print(pattern.match("dog",1))
輸出結果:
None
<re.Match object; span=(1, 2), match=‘o’>
- pattern.fullmatch() 如果整個string匹配這個正則表達式,就返回一個相應的匹配對象。否則就返回None。
可選參數(shù) pos 和 endpos 與 search() 含義相同。
import re pattern=re.compile("o[gh]") print(pattern.fullmatch("dog")) print(pattern.fullmatch("ogre")) print(pattern.fullmatch("doggie",1,3))
輸出結果:
None None <re.Match object; span=(1, 3), match=‘og’>
- pattern.findall(string[, pos[, endpos]]) 類似函數(shù) findall() , 使用了編譯后樣式,但也可以接收可選參數(shù) pos 和 endpos ,限制搜索范圍,就像 search()。
- pattren.finditer(string[, pos[, endpos]]) 類似函數(shù) finditer() , 使用了編譯后樣式,但也可以接收可選參數(shù) pos 和 endpos ,限制搜索范圍,就像 search()。
- pattern.split(string, maxsplit=0) 等價于 split() 函數(shù),使用了編譯后的樣式。
- pattern.sub(repl, string, count=0) 等價于 sub() 函數(shù),使用了編譯后的樣式。
二、re模塊下函數(shù)的匹配對象
正則表達式的函數(shù)一旦匹配成功,就是object對象,匹配對象支持以下方法和屬性:
group() 返回被 RE 匹配的字符串
如果只有一個參數(shù),結果就是一個字符串,如果沒有參數(shù),默認為0,相應的返回值就是整個匹配字符串。
m=re.match(r"(\w+) (\w+)", "I love you, Tom") m.group() m.group(0)
輸出結果:
‘I love’
如果它是一個范圍[1…99],結果就是相應的括號組字符串。
m.group(1) m.group(2)
輸出結果:
‘I’ ‘love’
如果有多個參數(shù),結果就是一個元組,第個參數(shù)對應一個。
m.group(1,2)
輸出結果:
(‘I’, ‘love’)
如果正則表達式使用了(?P…) 語法, groupN 參數(shù)就也可能是命名組合的名字。如果一個字符串參數(shù)在樣式中未定義為組合名,就引發(fā)一個 IndexError 異常。
import re m=re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") print(m.group("first_name")) print(m.group("last_name"))
輸出結果:
Malcolm Reynolds
命名組合同樣可以通過索引值引用
print(m.group(1)) print(m.group(2))
輸出結果:
Malcolm Reynolds
3.6版本后可以直接Match.getitem(g),等價于m.group(g)。
print(m[1]) print(m[2])
print(m['first_name']) print(m['last_name'])
輸出結果:
Malcolm Reynolds
- start() 返回匹配開始的位置
- end() 返回匹配結束的位置
- span() 返回一個元組包含匹配 (開始,結束) 的位置
import re result=re.match("hello","hello world") print(result.start()) print(result.end()) print(result.span())
輸出結果:
0
5
(0, 5)
匹配對象總是有一個布爾值 True。 所以可以簡單的用 if 語句來判斷是否匹配
import re result=re.match("hello","hello world") if result: print(result.group()) else: print("匹配失敗!")
輸出結果:
hello
到此這篇關于Python中re模塊下的函數(shù)詳解的文章就介紹到這了,更多相關Python的re模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Python正則表達re模塊之findall()函數(shù)詳解
- Python3使用xml.dom.minidom和xml.etree模塊兒解析xml文件封裝函數(shù)的方法
- Python re 模塊findall() 函數(shù)返回值展現(xiàn)方式解析
- 對python中的six.moves模塊的下載函數(shù)urlretrieve詳解
- Python3中正則模塊re.compile、re.match及re.search函數(shù)用法詳解
- python re模塊findall()函數(shù)實例解析
- Python編程之Re模塊下的函數(shù)介紹
- Python中threading模塊join函數(shù)用法實例分析
相關文章
Python基于隨機采樣一至性實現(xiàn)擬合橢圓(優(yōu)化版)
這篇文章主要對上一版的Python基于隨機采樣一至性實現(xiàn)擬合橢圓的優(yōu)化,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以了解一下2022-11-11將Django使用的數(shù)據(jù)庫從MySQL遷移到PostgreSQL的教程
這篇文章主要介紹了將Django使用的數(shù)據(jù)庫從MySQL遷移到PostgreSQL的教程,同時提到了一些注意事項,需要的朋友可以參考下2015-04-04Flask實現(xiàn)swagger在線文檔與接口測試流程詳解
Flask是一個使用Python編寫的輕量級Web應用框架。其WSGI工具箱采用 Werkzeug,模板引擎則使用Jinja2。Flask使用 BSD 授權。Flask也被稱為“microframework”,因為它使用簡單的核心,用 extension 增加其他功能,本篇帶你用Flask實現(xiàn)swagger在線文檔與接口測試2022-07-07Pycharm社區(qū)版創(chuàng)建Flask項目的實現(xiàn)步驟
本文主要介紹了Pycharm社區(qū)版創(chuàng)建Flask項目,包括設置Python環(huán)境、安裝Flask庫以及創(chuàng)建基本的項目結構,具有一定的參考價值,感興趣的可以了解一下2024-06-06python使用requests庫提交multipart/form-data請求的方法詳解
multipart/form-data的基礎是post請求,即基于post請求來實現(xiàn)的 ,下面這篇文章主要給大家介紹了關于python使用requests庫提交multipart/form-data請求的相關資料,需要的朋友可以參考下2023-01-01