強(qiáng)烈推薦
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),獲嘉企業(yè)網(wǎng)站建設(shè),獲嘉品牌網(wǎng)站建設(shè),網(wǎng)站定制,獲嘉網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,獲嘉網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。正則表達(dá)式
在線測試網(wǎng)站: https://regex101.com/
更多詳情參考官方文檔:
Python3中使用re
模塊支持正則表達(dá)式(Regular Expression),需要定義一個(gè)用于匹配的模式<br/>(pattern)
字符串,以及一個(gè)要匹配的字符串(string)
。簡單的匹配:
In [1]: import re
In [2]: m = re.match('My', 'My name is wangy')
In [3]: m
Out[3]: <_sre.SRE_Match object; span=(0, 2), match='My'>
In [4]: m.group() # 等價(jià)于m.group(0)
Out[4]: 'My'
In [5]: m.start(), m.end()
Out[5]: (0, 2)
In [6]: m.span()
Out[6]: (0, 2)
其中,My
是正則表達(dá)式模式,最簡單的,只匹配字符My
本身。而My name is wangy
是想要檢查的字符串,re.match()
函數(shù)用于查看字符串是不是以正則模式開頭
。
如果你僅僅是做一次簡單的文本匹配/搜索操作的話,可以直接使用 re
模塊級別的函數(shù),比如re.match
。如果你打算做大量的匹配和搜索操作的話,最好先編譯正則表達(dá)式
,然后再重復(fù)使用它:
In [1]: import re
In [2]: p = re.compile('[a-z]+') # [a-z]+ 是正則模式,表示1個(gè)或多個(gè)小寫字母
In [3]: p
Out[3]: re.compile(r'[a-z]+', re.UNICODE)
In [4]: if p.match('hello123'): # p是預(yù)編譯后的正則模式,它也有match等方法,只是參數(shù)不同,不需要再傳入正則模式。判斷字符串'hello123'是否以1個(gè)或多個(gè)小寫字母開頭
...: print('yes')
...: else:
...: print('no')
...:
yes
In [5]: if p.match('123hi'): # 重用預(yù)編譯過的正則模式
...: print('yes')
...: else:
...: print('no')
...:
no
模塊級別的函數(shù)會將最近編譯過的模式緩存起來,因此并不會消耗太多的性能, 但是如果使用預(yù)編譯模式的話,你將會減少查找和一些額外的處理損耗。
match()
從字符串開頭開始匹配可以使用模塊級別的re.match()
或預(yù)編譯模式的p.match()
,如果字符串是以正則表達(dá)式開頭,則表明匹配成功,返回匹配到的對象,比如<_sre.SRE_Match object; span=(0, 2), match='My'>
,如果匹配失敗,返回None
In [1]: import re
In [2]: m1 = re.match('wangy', 'wangy is a handsome boy.') # 模塊級的match方法
In [3]: m1 # 匹配成功,返回Match對象
Out[3]: <_sre.SRE_Match object; span=(0, 5), match='wangy'>
In [4]: m1.group() # Match對象有g(shù)roup()、start()、end()、span()等方法
Out[4]: 'wangy'
In [5]: m2 = re.match('mayun', 'wangy is a handsome boy.') # 匹配失敗
In [6]: type(m2) # 返回None
Out[6]: NoneType
In [7]: p = re.compile('wangy') # 預(yù)編譯正則模式也是可以的
In [8]: p.match('wangy is a handsome boy.') # 調(diào)用預(yù)編譯正則模式的match方法
Out[8]: <_sre.SRE_Match object; span=(0, 5), match='wangy'>
search()
尋找首次匹配如果字符串中有多個(gè)地方與正則表達(dá)式匹配的話,search()
方法返回第一次匹配到的結(jié)果:
search(pattern, string, flags=0)
Scan through string looking for a match to the pattern, returning
a match object, or None if no match was found.
(END)
In [1]: import re
In [2]: s = 'I wish I may, I wish I might have a dish of fish tonight.'
In [3]: re.search('wish', s)
Out[3]: <_sre.SRE_Match object; span=(2, 6), match='wish'>
In [4]: re.search('wish', s).span()
Out[4]: (2, 6)
findall()
或finditer()
尋找所有匹配前面兩個(gè)函數(shù)都是查找到一個(gè)匹配后就停止,如果要查找字符串中所有的匹配項(xiàng),可以使用findall()
In [1]: import re
In [2]: text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
In [3]: p = re.compile('\d+/\d+/\d+')
In [4]: p.findall(text)
Out[4]: ['11/27/2012', '3/13/2013']
findall()
方法會搜索文本并以列表形式返回所有的匹配。 如果你想以迭代
方式返回匹配,可以使用finditer()
方法來代替,比如:
In [5]: iters = p.finditer(text)
In [6]: iters
Out[6]: <callable_iterator at 0x7f94c1703f98>
In [7]: for m in iters:
...: print(m)
...:
<_sre.SRE_Match object; span=(9, 19), match='11/27/2012'>
<_sre.SRE_Match object; span=(34, 43), match='3/13/2013'>
split()
按匹配切分字符串的str.split()
方法只適應(yīng)于非常簡單的字符串分割情形, 它并不允許有多個(gè)分隔符
或者是分隔符周圍不確定的空格
。 當(dāng)你需要更加靈活的切割字符串的時(shí)候,最好使用 re.split() 方法:
In [1]: import re
In [2]: line = 'asdf fjdk; afed, fjek,asdf, foo'
In [3]: re.split(r'[;,\s]\s*', line) # 正則模式表示 ;或,或空白字符且它們的后面再跟0個(gè)或多個(gè)空白字符
Out[3]: ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
sub()
替換匹配對于簡單的字面模式,直接使用字符串的str.replace()
方法即可,比如:
In [1]: text = 'yeah, but no, but yeah, but no, but yeah'
In [2]: text.replace('yeah', 'yep')
Out[2]: 'yep, but no, but yep, but no, but yep'
對于復(fù)雜的模式,請使用re
模塊中的sub()
,比如你想將形式為 11/27/2012 的日期字符串改成 2012-11-27 。示例如下:
In [1]: import re
In [2]: text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
In [3]: re.sub('(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
Out[3]: 'Today is 2012-11-27. PyCon starts 2013-3-13.'
sub()
函數(shù)中的第一個(gè)參數(shù)是被匹配的模式,第二個(gè)參數(shù)是替換模式。反斜杠數(shù)字比如\3
指向前面模式的第3個(gè)捕獲組,此時(shí)要加r
指定為原始字符串,否則會被Python自動轉(zhuǎn)義為\x03
對于更加復(fù)雜的替換,可以傳遞一個(gè)替換回調(diào)函數(shù)來代替。一個(gè)替換回調(diào)函數(shù)的參數(shù)是一個(gè)Match
對象,也就是match()
或者find()
返回的對象。使用group()
方法來提取特定的匹配部分。回調(diào)函數(shù)最后返回替換字符串。比如:
In [1]: import re
In [2]: from calendar import month_abbr
In [3]: def change_date(m):
...: mon_name = month_abbr[int(m.group(1))]
...: return '{} {} {}'.format(m.group(2), mon_name, m.group(3))
...:
...:
In [4]: text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
In [5]: p = re.compile(r'(\d+)/(\d+)/(\d+)')
In [6]: p.sub(change_date, text)
Out[6]: 'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'
如果除了替換后的結(jié)果外,你還想知道有多少替換發(fā)生了,可以使用re.subn()
來代替。比如:
In [7]: newtext, n = p.subn(r'\3-\1-\2', text)
In [8]: newtext
Out[8]: 'Today is 2012-11-27. PyCon starts 2013-3-13.'
In [9]: n
Out[9]: 2
語法 | 說明 | 模式示例 | 匹配 |
---|---|---|---|
普通字符 | 普通的文本值代表自身,用于匹配非特殊字符 | ab | ab |
. | 匹配除換行符\n 以外的任意一個(gè)字符。如果要匹配多行文本,可以指定re.DOTALL 標(biāo)志位,或者(?:.|\n)* 表示匹配. 或\n ,且作為一個(gè)非捕獲組,再指定* 表示0個(gè)或多個(gè)前面的非捕獲組 | ab. | 匹配abc或abC,不匹配ab,因?yàn)閎后面一定要有一個(gè)字符 |
\ | 轉(zhuǎn)義字符,比如要匹配點(diǎn)號. 本身,需要轉(zhuǎn)義它\. ,如果不轉(zhuǎn)義,. 將有上一行所示的特殊含義 | ab\. | 匹配ab.com,不匹配abc |
[] | 匹配中括號內(nèi)的一個(gè)字符<br />1. 中括號內(nèi)的字符可以全部列出,如[abc] 表示匹配字符a 或b 或c <br />2. 也可以使用- 表示范圍,如[a-z] 表示匹配所以小寫字母中的任意一個(gè)字符<br />3. 本文后續(xù)要介紹的如* 、+ 等特殊字符在中括號內(nèi)將失去特殊含義,如[*+()] 表示匹配字符* 或+ 或( 或) <br />4. 本文后續(xù)要介紹的特殊字符集如\d 、\w 等也可以放入此中括號內(nèi),繼續(xù)保持特殊含義<br />5. 如果中括號內(nèi)的字符序列前面有一個(gè)^ ,表示不匹配中括號內(nèi)的任何一個(gè)字符,如[^0-9] 表示不匹配數(shù)字,a[^0-9]c 不匹配a1c ,但會匹配abc <br />6. 要匹配字符] ,可以轉(zhuǎn)義它,或者把它放在中括號內(nèi)的首位,如a[()[\]{}]c 或a[]()[{}]c 都可以匹配到a]c | a[0-9]b | a1b或a2b |
語法 | 說明 | 模式示例 | 匹配 |
---|---|---|---|
\d | 匹配任意一個(gè) 數(shù)字字符,等價(jià)于[0-9] | a\db | a1b |
\D | 匹配任意一個(gè) 非數(shù)字字符,等價(jià)于[^0-9] | a\Db | aAb |
\s | 匹配任意一個(gè) 空白字符,等價(jià)于[ \t\n\r\f\v] | a\sb | a b |
\S | 匹配任意一個(gè) 非空白字符,等價(jià)于[^ \t\n\r\f\v] | a\Sb | aAb |
\w | 匹配任意一個(gè) alphanumeric character,等價(jià)于[a-zA-Z0-9_] | a\wb | azb或aZb或a1b或a_b |
\W | 匹配任意一個(gè) non-alphanumeric character,等價(jià)于[^a-zA-Z0-9_] | a\Wb | a-b或a b |
這些字符集也可以放入[]
中,比如a[\d\s]b
表示匹配字符a和字符b,且中間有一個(gè)數(shù)字字符或空白字符,所以它會匹配a1b
或a b
等
Python的string
模塊中預(yù)先定義了一些可供我們測試用的字符串常量。我們將使用其中
的printable
字符串,它包含 100 個(gè)可打印的 ASCII 字符,包括大小寫字母、數(shù)字、空格
符以及標(biāo)點(diǎn)符號:
In [1]: import string
In [2]: printable = string.printable
In [3]: len(printable)
Out[3]: 100
In [4]: printable[:50]
Out[4]: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN'
In [5]: printable[50:]
Out[5]: 'OPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
printable 中哪些字符是數(shù)字?
In [7]: re.findall('\d', printable)
Out[7]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
哪些字符是數(shù)字、字符或下劃線?
In [8]: print(re.findall('\w', printable), end='')
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', '
x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_']
哪些屬于空格符?
In [10]: re.findall('\s', printable)
Out[10]: [' ', '\t', '\n', '\r', '\x0b', '\x0c']
\d
和\w
不僅會匹配ASCII字符,還可以匹配Unicode字符:
In [11]: s = 'abc' + '-/*' + '\u00ea' + '\u0115'
In [12]: re.findall('\w', s)
Out[12]: ['a', 'b', 'c', 'ê', '?']
說明: 表格中 斜體 的 prev 表示 1. 單個(gè)字符如
a
2. 或者復(fù)雜的表達(dá)式如(abc)
或(.|\n)
(這是分組的功能,見1.5)
語法 | 說明 | 模式示例 | 匹配 |
---|---|---|---|
prev * | 匹配0個(gè)或多個(gè) prev,盡可能多 地匹配,貪婪模式,等價(jià)于{0,} | ab* | a或ab或abb或abbb,注意是匹配字符a后面跟0個(gè)或多個(gè)字符b |
prev *? | 匹配0個(gè)或多個(gè) prev,盡可能少 地匹配,非貪婪模式 | ab*? | a,非貪婪模式下匹配0個(gè)字符b |
prev + | 匹配1個(gè)或多個(gè) prev,盡可能多 地匹配,貪婪模式,等價(jià)于{1,} | ab+ | ab或abb或abbb |
prev +? | 匹配1個(gè)或多個(gè) prev,盡可能少 地匹配,非貪婪模式 | ab+? | ab,非貪婪模式下匹配1個(gè)字符b |
prev ? | 匹配0個(gè)或1個(gè) prev,盡可能多 地匹配,貪婪模式,等價(jià)于{0,1} | ab? | a或ab |
prev ?? | 匹配0個(gè)或1個(gè) prev,盡可能少 地匹配,非貪婪模式 | ab?? | a,非貪婪模式下匹配0個(gè)字符b |
prev {m} | 匹配m個(gè)連續(xù)的 prev | a{3} | aaa |
prev {m,n} | 匹配m到n個(gè)連續(xù)的 prev ,盡可能多 地匹配,貪婪模式。n 可選,如果不指定,則表示m到無窮多個(gè)連續(xù)的 prev | a{3,5} | aaa或aaaa或aaaaa |
prev {m,n}? | 匹配m到n個(gè)連續(xù)的 prev ,盡可能少 地匹配,非貪婪模式 | a{3,5}? | aaa |
可以在*
或+
或?
的后面再添加一個(gè)?
,此時(shí)表示非貪婪
模式匹配,Python中的正則表達(dá)式默認(rèn)是貪婪模式匹配,它會在滿足整個(gè)表達(dá)式要求的前提下,盡可能多地去匹配字符,具體效果見后面的示例
語法 | 說明 | 模式示例 | 匹配 |
---|---|---|---|
^ prev | 匹配以 prev 開頭的字符串(脫字符)。多行文本中,默認(rèn)^ 只會匹配第一行的開頭位置,如果設(shè)置了re.MULTILINE 標(biāo)志位,則^ 也會匹配換行符之后 的開頭位置 | ^ab | abcd |
prev $ | 匹配以 prev 結(jié)尾的字符串。多行文本中,默認(rèn)$ 只會匹配最后一行的結(jié)尾位置,如果設(shè)置了re.MULTILINE 標(biāo)志位,則$ 也會匹配換行符之前的結(jié)尾位置 | ab$ | 只匹配ab。如果是.*ab$ 則會匹配123ab,否則使用ab\Z |
\b | 單詞邊界。Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of word characters. Note that formally, \b is defined as the boundary between a \w and a \W character (or vice versa), or between \w and the beginning/end of the string. 注意: \b 在Python中默認(rèn)會被轉(zhuǎn)義為\x08 表示退格 ,需要將整個(gè)正則表達(dá)式指定為原始字符串(在前面加個(gè)r),即r'\bfoo\b' | r'\bfoo\b' <br />請使用re.findall() 測試 | 匹配foo 或foo. 或(foo) 或bar foo baz ,但不匹配foobar 或foo3 |
\B | 非單詞邊界。Matches the empty string, but only when it is not at the beginning or end of a word. \B is just the opposite of \b . | py\B | 匹配python 或py3 或py2 ,但不匹配py 或py. 或py! |
\A | Matches only at the start of the string. | \Aab | abcde |
\Z | Matches only at the end of the string. | ab\Z | 123ab |
詳情請移步我的個(gè)人網(wǎng)站: http://www.madmalls.com/blog/post/regular-expression-in-python3/
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
標(biāo)題名稱:Python正則表達(dá)式詳解與re模塊的使用-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article40/dcjeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、微信小程序、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)公司、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容