Python正則表達(dá)式詳解與re模塊的使用-創(chuàng)新互聯(lián)

強(qiáng)烈推薦正則表達(dá)式在線測(cè)試網(wǎng)站: https://regex101.com/

創(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ò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,獲嘉網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1. 標(biāo)準(zhǔn)庫(kù)模塊 re

更多詳情參考官方文檔:

  • https://docs.python.org/3/howto/regex.html#regex-howto
  • https://docs.python.org/3/library/re.html

Python3中使用re模塊支持正則表達(dá)式(Regular Expression),需要定義一個(gè)用于匹配的模式<br/>(pattern)字符串,以及一個(gè)要匹配的字符串(string)。簡(jiǎn)單的匹配:

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á)式模式,最簡(jiǎn)單的,只匹配字符My本身。而My name is wangy是想要檢查的字符串,re.match()函數(shù)用于查看字符串是不是以正則模式開頭。

如果你僅僅是做一次簡(jiǎn)單的文本匹配/搜索操作的話,可以直接使用 re 模塊級(jí)別的函數(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

模塊級(jí)別的函數(shù)會(huì)將最近編譯過的模式緩存起來,因此并不會(huì)消耗太多的性能, 但是如果使用預(yù)編譯模式的話,你將會(huì)減少查找和一些額外的處理?yè)p耗。

1.1 使用match()從字符串開頭開始匹配

可以使用模塊級(jí)別的re.match()或預(yù)編譯模式的p.match(),如果字符串是以正則表達(dá)式開頭,則表明匹配成功,返回匹配到的對(duì)象,比如&lt;_sre.SRE_Match object; span=(0, 2), match='My'&gt;,如果匹配失敗,返回None

In [1]: import re

In [2]: m1 = re.match('wangy', 'wangy is a handsome boy.')  # 模塊級(jí)的match方法

In [3]: m1  # 匹配成功,返回Match對(duì)象
Out[3]: <_sre.SRE_Match object; span=(0, 5), match='wangy'>

In [4]: m1.group()  # Match對(duì)象有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'>

1.2 使用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)

1.3 使用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()方法會(huì)搜索文本并以列表形式返回所有的匹配。 如果你想以迭代方式返回匹配,可以使用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'>

1.4 使用split()按匹配切分

字符串的str.split()方法只適應(yīng)于非常簡(jiǎn)單的字符串分割情形, 它并不允許有多個(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']

1.5 使用sub()替換匹配

對(duì)于簡(jiǎn)單的字面模式,直接使用字符串的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'

對(duì)于復(fù)雜的模式,請(qǐng)使用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指定為原始字符串,否則會(huì)被Python自動(dòng)轉(zhuǎn)義為\x03

對(duì)于更加復(fù)雜的替換,可以傳遞一個(gè)替換回調(diào)函數(shù)來代替。一個(gè)替換回調(diào)函數(shù)的參數(shù)是一個(gè)Match對(duì)象,也就是match()或者find()返回的對(duì)象。使用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

2. 正則表達(dá)式語(yǔ)法

2.1 基本模式

語(yǔ)法 說明 模式示例 匹配
普通字符普通的文本值代表自身,用于匹配非特殊字符abab
.匹配除換行符\n以外的任意一個(gè)字符。如果要匹配多行文本,可以指定re.DOTALL標(biāo)志位,或者(?:.|\n)*表示匹配.\n,且作為一個(gè)非捕獲組,再指定*表示0個(gè)或多個(gè)前面的非捕獲組ab.匹配abc或abC,不匹配ab,因?yàn)閎后面一定要有一個(gè)字符
\轉(zhuǎn)義字符,比如要匹配點(diǎn)號(hào).本身,需要轉(zhuǎn)義它\.,如果不轉(zhuǎn)義,.將有上一行所示的特殊含義ab\.匹配ab.com,不匹配abc
[]匹配中括號(hào)內(nèi)的一個(gè)字符<br />1. 中括號(hào)內(nèi)的字符可以全部列出,如[abc]表示匹配字符abc<br />2. 也可以使用-表示范圍,如[a-z]表示匹配所以小寫字母中的任意一個(gè)字符<br />3. 本文后續(xù)要介紹的如*、+等特殊字符在中括號(hào)內(nèi)將失去特殊含義,如[*+()]表示匹配字符*+()<br />4. 本文后續(xù)要介紹的特殊字符集如\d、\w等也可以放入此中括號(hào)內(nèi),繼續(xù)保持特殊含義<br />5. 如果中括號(hào)內(nèi)的字符序列前面有一個(gè)^,表示不匹配中括號(hào)內(nèi)的任何一個(gè)字符,如[^0-9]表示不匹配數(shù)字,a[^0-9]c不匹配a1c,但會(huì)匹配abc<br />6. 要匹配字符],可以轉(zhuǎn)義它,或者把它放在中括號(hào)內(nèi)的首位,如a[()[\]{}]ca[]()[{}]c都可以匹配到a]ca[0-9]ba1b或a2b

2.2 特殊字符集

語(yǔ)法 說明 模式示例 匹配
\d匹配任意一個(gè)數(shù)字字符,等價(jià)于[0-9]a\dba1b
\D匹配任意一個(gè)非數(shù)字字符,等價(jià)于[^0-9]a\DbaAb
\s匹配任意一個(gè)空白字符,等價(jià)于[ \t\n\r\f\v]a\sba b
\S匹配任意一個(gè)非空白字符,等價(jià)于[^ \t\n\r\f\v]a\SbaAb
\w匹配任意一個(gè) alphanumeric character,等價(jià)于[a-zA-Z0-9_]a\wbazb或aZb或a1b或a_b
\W匹配任意一個(gè) non-alphanumeric character,等價(jià)于[^a-zA-Z0-9_]a\Wba-b或a b

這些字符集也可以放入[]中,比如a[\d\s]b表示匹配字符a和字符b,且中間有一個(gè)數(shù)字字符或空白字符,所以它會(huì)匹配a1ba b

Python的string模塊中預(yù)先定義了一些可供我們測(cè)試用的字符串常量。我們將使用其中
printable字符串,它包含 100 個(gè)可打印的 ASCII 字符,包括大小寫字母、數(shù)字、空格
符以及標(biāo)點(diǎn)符號(hào):

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不僅會(huì)匹配ASCII字符,還可以匹配Unicode字符:

In [11]: s = 'abc' + '-/*' + '\u00ea' + '\u0115'

In [12]: re.findall('\w', s)
Out[12]: ['a', 'b', 'c', 'ê', '?']

2.3 數(shù)量

說明: 表格中 斜體prev 表示 1. 單個(gè)字符如a 2. 或者復(fù)雜的表達(dá)式如(abc)(.|\n)(這是分組的功能,見1.5)

語(yǔ)法 說明 模式示例 匹配
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ù)的 preva{3}aaa
prev {m,n}匹配m到n個(gè)連續(xù)的 prev盡可能多地匹配,貪婪模式。n可選,如果不指定,則表示m到無窮多個(gè)連續(xù)的 preva{3,5}aaa或aaaa或aaaaa
prev {m,n}?匹配m到n個(gè)連續(xù)的 prev ,盡可能少地匹配,非貪婪模式a{3,5}?aaa

可以在*+?的后面再添加一個(gè)?,此時(shí)表示非貪婪模式匹配,Python中的正則表達(dá)式默認(rèn)是貪婪模式匹配,它會(huì)在滿足整個(gè)表達(dá)式要求的前提下,盡可能多地去匹配字符,具體效果見后面的示例

2.4 邊界

語(yǔ)法 說明 模式示例 匹配
^ prev匹配以 prev 開頭的字符串(脫字符)。多行文本中,默認(rèn)^只會(huì)匹配第一行的開頭位置,如果設(shè)置了re.MULTILINE標(biāo)志位,則^也會(huì)匹配換行符之后的開頭位置^ababcd
prev $匹配以 prev 結(jié)尾的字符串。多行文本中,默認(rèn)$只會(huì)匹配最后一行的結(jié)尾位置,如果設(shè)置了re.MULTILINE標(biāo)志位,則$也會(huì)匹配換行符之前的結(jié)尾位置ab$只匹配ab。如果是.*ab$則會(huì)匹配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)會(huì)被轉(zhuǎn)義為\x08表示退格,需要將整個(gè)正則表達(dá)式指定為原始字符串(在前面加個(gè)r),即r'\bfoo\b'r'\bfoo\b'<br />請(qǐng)使用re.findall()測(cè)試匹配foofoo.(foo)bar foo baz,但不匹配foobarfoo3
\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匹配pythonpy3py2,但不匹配pypy.py!
\AMatches only at the start of the string.\Aababcde
\ZMatches only at the end of the string.ab\Z123ab

2.5 分組

2.6 擴(kuò)展語(yǔ)法

3. 實(shí)例

3.1 字符串忽略大小寫的搜索替換

3.2 最短匹配模式: 非貪婪

3.3 多行匹配

詳情請(qǐng)移步我的個(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ù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱:Python正則表達(dá)式詳解與re模塊的使用-創(chuàng)新互聯(lián)
文章鏈接:http://muchs.cn/article40/dcjeho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、微信小程序網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)公司、服務(wù)器托管外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)