python3測(cè)試工具開(kāi)發(fā)快速入門(mén)教程3文本處理1正則表達(dá)式

簡(jiǎn)介

-- 后面有很多習(xí)題,可以先做題目再來(lái)看文章

參考資料:https://docs.python.org/3/howto/index.html

正則表達(dá)式(Regular expressions REs或regexes或regex patterns)本質(zhì)是小的且高度專業(yè)化的編程語(yǔ)言。它嵌入到 Python 中,調(diào)用使用re模塊。需要指定一些規(guī)則來(lái)描述那些你希望匹配的字符串集合。這些字符串集合可能包含英語(yǔ)句子、e-mail地址、TeX 命令,或任何你想要的東東。然后可以提出問(wèn)題,例如“字符串是否匹配該模式?”或“模式是否匹配字符串?”。 您還可以使用RE修改字符串或以各種方式拆分它。

正則表達(dá)式模式被編譯成字節(jié)碼,然后由 C 語(yǔ)言寫(xiě)的匹配引擎執(zhí)行。對(duì)于高級(jí)的使用,你可能需要關(guān)注匹配引擎是如何執(zhí)行給定RE,并通過(guò)一定的方式來(lái)編寫(xiě)RE,以便產(chǎn)生運(yùn)行得更快的字節(jié)碼。

正則表達(dá)式語(yǔ)言小而嚴(yán)格,不是所有的字符處理都可以使用正則表達(dá)式。還有一些任務(wù),可以使用正則表達(dá)式來(lái)完成,但是表達(dá)式非常復(fù)雜。在這種情況下編寫(xiě) Python 代碼來(lái)處理會(huì)更好些;盡管 Python 代碼比精巧的正則表達(dá)式執(zhí)行起來(lái)會(huì)慢一些,但可能會(huì)更容易理解。

簡(jiǎn)單的模式

字符匹配

大多數(shù)字母和字符會(huì)匹配它們自身。舉個(gè)例子,正則表達(dá)式test將完全匹配字符串test(你可以啟用不區(qū)分大小寫(xiě)模式,該正則表達(dá)式可以匹配Test或TEST)。

這條規(guī)則有例外; 有些字符是特殊的元字符,不匹配自身。 相反,它們匹配一些與眾不同的東西,或者通過(guò)重復(fù)它們或改變它們的含義來(lái)影響RE的其他部分。

這是元字符的完整列表

#!python
. ^ $ * + ? { } [ ] \ | ( )

方括號(hào) [ ]指定用于存放你需要匹配的字符集合。例如 [abc] 會(huì)匹配字符 a,b 或 c;[a-c] 可以實(shí)現(xiàn)相同功能。后者使用范圍來(lái)表示與前者相同的字符集合。如果你想只匹配小寫(xiě)字母,你的 RE 可能寫(xiě)成 [a-z]。

注意方括號(hào)元字符在中不會(huì)觸發(fā)特殊功能例如 [akm] 會(huì)匹配字符 'a','k','m' 或 ''。

你還可以匹配方括號(hào)中未列出的所有其它字符,開(kāi)頭添加 ^即可,例如 [^5] 會(huì)匹配除了 '5' 之外的任何字符。

元字符轉(zhuǎn)義:前面加上一個(gè)反斜杠,以消除它們的特殊功能:[,\ 。

反斜杠后邊跟一些字符還可以表示特殊的意義,例如表示十進(jìn)制數(shù)字,表示所有的字母或者表示非空白的字符集合。

讓我們來(lái)舉個(gè)例子:\w 匹配任何單詞字符。如果正則表達(dá)式以字節(jié)的形式表示,這相當(dāng)字符類 [a-zA-Z0-9_];如果正則表達(dá)式是一個(gè)字符串,\w 會(huì)匹配所有 Unicode 數(shù)據(jù)庫(kù)(unicodedata 模塊提供)中標(biāo)記為字母的字符。你可以在編譯正則表達(dá)式的時(shí)候,通過(guò)提供 re.ASCII 表示進(jìn)一步限制 \w 的定義。

批注:re.ASCII 標(biāo)志使得 \w 只能匹配 ASCII 字符,不要忘了,Python3 是 Unicode 的。

下邊列舉一些反斜杠加字符構(gòu)成的特殊含義:

特殊字符 含義
\number 匹配相同編號(hào)的組。組從1開(kāi)始編號(hào)。例如,(.+) \1匹配'the the'或'55 55',但不匹配'thethe'(注意組后面的空格)。此特殊序列只能用于匹配前99個(gè)組。如果數(shù)字的第一個(gè)數(shù)字是0,或者數(shù)字是3個(gè)八進(jìn)制數(shù)字長(zhǎng),則不會(huì)將其解釋為組匹配,而是解釋為具有八進(jìn)制值編號(hào)的字符。在方括號(hào)內(nèi),所有數(shù)字轉(zhuǎn)義都被視為字符。默認(rèn)支持Unicode,中文標(biāo)點(diǎn)也會(huì)作為邊界??梢詥⒂胷e.ASCII。
\d 匹配任何十進(jìn)制數(shù)字,相當(dāng)于類[0-9]
\D 與 \d 相反,匹配任何非十進(jìn)制數(shù)字的字符,相當(dāng)于 [^0-9]
\s 匹配任何空白字符(包含空格、換行符、制表符等),相當(dāng)于類 [\t\n\r\f\v]
\S 與 \s 相反,匹配任何非空白字符,當(dāng)相于類 [^\t\n\r\f\v]
\w 匹配任何字符,設(shè)置了re.ASCII的情況下等同于[a-zA-Z0-9_]
\W 與 \w 相反,設(shè)置了re.ASCII的情況下等同于[^a-zA-Z0-9_]
\b 匹配單詞的開(kāi)始或結(jié)束
\B 與 \b 相反
\A 僅匹配字符串的開(kāi)始。
\Z 僅匹配字符串末尾。

例如 [\s,.] 匹配任何空白字符(/s 的特殊含義),',' 或 ‘.’ 。

轉(zhuǎn)義字符:

\a      \b      \f      \n
\r      \t      \u      \U
\v      \x      \\

'.'匹配除了換行符以外的任何字符。如果設(shè)置re.DOTALL,它將匹配包括換行在內(nèi)的任何字符。

重復(fù)

'*' : 指定前一個(gè)字符匹配零次或者多次。

例如ca*t將匹配 ct(0 個(gè) a),cat(1 個(gè)字符 a),caaat(3 個(gè)字符 a),等等。需要注意的是,由于受到 C 語(yǔ)言的 int 類型大小的內(nèi)部限制,正則表達(dá)式引擎會(huì)限制字符 'a' 的重復(fù)個(gè)數(shù)不超過(guò) 20 億個(gè);不過(guò),通常我們工作也用不到那么大的數(shù)據(jù),你未必有這么大的內(nèi)存。

默認(rèn)的是貪婪的,當(dāng)你重復(fù)匹配一個(gè) RE 時(shí),匹配引擎會(huì)嘗試盡可能多的去匹配。直到RE不匹配或者到了結(jié)尾,匹配引擎就會(huì)回退一個(gè)字符,然后再繼續(xù)嘗試。

表達(dá)式 a[bcd]*b,首先需要匹配字符 'a',然后零個(gè)到多個(gè) [bcd],最后以 'b' 結(jié)尾。那現(xiàn)在想象一下,這個(gè) RE 匹配字符串 abcbd 會(huì)怎樣?

步驟 匹配 說(shuō)明
1 a 匹配 RE 的第一個(gè)字符 'a'
2 abcbd 引擎在符合規(guī)則的情況下盡可能地匹配 [bcd]*,直到該字符串的結(jié)尾
3 失敗 引擎嘗試匹配 RE 最后一個(gè)字符 ‘b’,但當(dāng)前位置已經(jīng)是字符串的結(jié)尾,所以失敗告終
4 abcb 回退,所以 [bcd]* 匹配少一個(gè)字符
5 失敗 再一次嘗試匹配 RE 最后一個(gè)字符 'b',但字符串最后一個(gè)字符是 'd',所以失敗告終
6 abc 再次回退,所以 [bcd]* 這次只匹配 'bc'
7 abcb 再一次嘗試匹配這符 'b',這一次字符串當(dāng)前位置指向的字符正好是 'b',匹配成功。最終,RE 匹配的結(jié)果是 abcb 。

另一個(gè)實(shí)現(xiàn)重復(fù)的元字符是 +,用于指定前一個(gè)字符匹配一次或者多次。

要特別注意 * 和 + 的區(qū)別:* 匹配的是零次或者多次,所以被重復(fù)的內(nèi)容可能壓根兒不會(huì)出現(xiàn);+ 至少需要出現(xiàn)一次。例如 ca+t 會(huì)匹配 cat 和 caaat,但不會(huì)匹配 ct 。

還有兩個(gè)表示重復(fù)的元字符,一個(gè)是問(wèn)號(hào)?: 字符匹配零次或者一次。

元字符 {m,n}(m 和 n 都是十進(jìn)制數(shù)),必須匹配 m 次到 n 次之間。例如 a/{1,3}b 會(huì)匹配 a/b,a//b 和 a///b 。但不會(huì)匹配 ab(沒(méi)有斜杠);也不會(huì)匹配 a////b(斜杠超過(guò)三個(gè))。

你可以省略 m 或者 n,這樣的話,引擎會(huì)用合理的值代替。 m默認(rèn)為0;n 默認(rèn)為 20 億。

{0,}跟’*‘ 是一樣的;{1,}跟‘+’是一樣的;{0,1} 跟?是一樣的。不過(guò)還是鼓勵(lì)大家記住并使用 * 、+ 和 ?,因?yàn)檫@些字符更短并且更容易閱讀。

習(xí)題

1, 下面那些不是python3正則表達(dá)式的元字符:

A $ B - C * D ? E /

參考答案:B E

2,python3正則表達(dá)式r'\bfoo\b'匹配下面哪些字符串

A 'foo' B 'foo.' C '(foo)' D 'bar foo baz' E 'foobar' F 'foo3'

參考答案:A B C D

3,python3正則表達(dá)式r'\bfoo\b'匹配下面哪些字符串

A 'foo,' B 'foo。' C '(foo!' D 'bar foo baz' E 'foobar' F 'foo3'

參考答案:A B C D

4,下面python3正則表達(dá)式元字符的描述哪些是錯(cuò)誤的。
A. 默認(rèn)\w不能匹配漢字
B. 默認(rèn)\w能匹配漢字
C. 默認(rèn).能匹配換行符
D. 默認(rèn).不能匹配換行符

參考答案:A C

使用正則表達(dá)式

Python通過(guò)re模塊提供正則表達(dá)式支持,并可將正則表達(dá)式編譯成對(duì)象,用它們來(lái)進(jìn)行匹配。

編譯正則表達(dá)式

正則表達(dá)式編譯為模式對(duì)象,該對(duì)象擁有各種方法,如查找模式匹配或者執(zhí)行字符串替換。

>>> import re
>>> p = re.compile('ab*')
>>> p
re.compile('ab*')

re.compile()也接受可選的flags 參數(shù),用于開(kāi)啟各種特殊功能和語(yǔ)法變化。

簡(jiǎn)單的例子:

>>> p = re.compile('ab*', re.IGNORECASE)

正則表達(dá)式作為字符串參數(shù)傳給 re.compile() 。由于正則表達(dá)式并不是 Python語(yǔ)言的核心部分,因此沒(méi)有為它提供特殊的語(yǔ)法支持,所以正則表達(dá)式只能以字符串的形式表示。

原始字符串

'\section' 要用'\\section'表示。不巧,Python 字符串也使用 '\' 表示字符 ''。原始字符串則方便得多:r"\section"即可。

匹配

模式對(duì)象的常用方法:

方法 功能
match() 判斷正則表達(dá)式是否從開(kāi)始處匹配一個(gè)字符串
search() 遍歷字符串,找到正則表達(dá)式匹配的第一個(gè)位置
findall() 遍歷字符串,找到正則表達(dá)式匹配的所有位置,并以列表的形式返回
finditer() 遍歷字符串,找到正則表達(dá)式匹配的所有位置,并以迭代器的形式返回

如果沒(méi)有找到任何匹配的話,match() 和 search() 會(huì)返回 None;如果匹配成功,則會(huì)返回匹配對(duì)象(match object),包含所有匹配的信息:例如從哪兒開(kāi)始,到哪兒結(jié)束,匹配的子字符串等等。

python自帶了正則表達(dá)式調(diào)試工具redemo.py:

圖片.png

實(shí)例:

>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')
>>> p.match("")
>>> print(p.match(""))
None
>>> m = p.match('tempo')
>>> m
<re.Match object; span=(0, 5), match='tempo'>
>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)

匹配對(duì)象包含了很多方法和屬性,以下幾個(gè)是最重要的:

方法 功能
group() 返回匹配的字符串
start() 返回匹配的開(kāi)始位置
end() 返回匹配的結(jié)束位置
span() 返回元組表示匹配位置(start, end)

match的start總是0,search() 方法則不一定了:

>>> print(p.match('::: message'))
None
>>> m = p.search('::: message'); print(m)
<re.Match object; span=(4, 11), match='message'>
>>> m.group()
'message'
>>> m.span()
(4, 11)

在實(shí)際應(yīng)用中,最常用的方法是將匹配對(duì)象存放在局部變量中,并檢查其返回值是否為 None 。

p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')

有兩個(gè)方法可以返回所有的匹配結(jié)果,一個(gè)是 findall(),一個(gè)是 finditer() 。

findall() 返回的是一個(gè)列表:

>>> p = re.compile(r'\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']

而 finditer() 則是將匹配對(duì)象作為迭代器返回:

>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator  
<callable_iterator object at 0x...>
>>> for match in iterator:
...     print(match.span())
...
(0, 2)
(22, 24)
(29, 31)

模塊級(jí)函數(shù)

re 模塊同時(shí)還提供了一些全局函數(shù),例如 match(),search(),findall(),sub() 等。這些函數(shù)跟模式對(duì)象同名方法一樣,只是增加了為正則表達(dá)式字符串的第一個(gè)參數(shù)。

>>> print(re.match(r'From\s+', 'Fromage amk'))
None
>>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')  
<re.Match object; span=(0, 5), match='From '>

這些函數(shù)幫你自動(dòng)創(chuàng)建模式對(duì)象,并調(diào)用相關(guān)的函數(shù)。它們還將編譯好的模式對(duì)象存放在緩存中,以便將來(lái)可以快速地直接調(diào)用。

在循環(huán)中大量的使用正則表達(dá)式,預(yù)編譯的話可以節(jié)省一些函數(shù)調(diào)用,用模式的方法更好。但如果是循環(huán)外部,因?yàn)橛袃?nèi)部緩存機(jī)制,兩者效率相差無(wú)幾。

編譯標(biāo)識(shí)

編譯標(biāo)識(shí)可修改正則表達(dá)式的工作方式。在 re 模塊下,編譯標(biāo)識(shí)均有完整名和簡(jiǎn)寫(xiě),例如 IGNORECASE 簡(jiǎn)寫(xiě)是 I。

標(biāo)志 含義
ASCII,A 使得轉(zhuǎn)義符號(hào) \w,\b,\s 和 \d 只能匹配 ASCII 字符
DOTALL,S 使得 . 匹配任何符號(hào),包括換行符
IGNORECASE,I 不區(qū)分大小寫(xiě)
LOCALE,L 支持當(dāng)前語(yǔ)言(區(qū)域)設(shè)置
MULTILNE,M 多行匹配,影響 ^ 和 $
VERBOSE,X(for'extended') 啟用詳細(xì)的正則表達(dá)式, 更簡(jiǎn)潔且更容易理解。

下面我們來(lái)詳細(xì)講解一下它們的含義:

  • I

IGNORECASE

不區(qū)分大小寫(xiě)。舉個(gè)例子,正則表達(dá)式[a-z] 或[A-Z]會(huì)匹配對(duì)應(yīng)的小寫(xiě)字母會(huì)匹配52個(gè)ASCII字母。還有4個(gè)非ASCII字母:'?'(U + 0130,拉丁大寫(xiě)字母I上面帶點(diǎn)),'?'(U + 0131,拉丁文小寫(xiě)字母無(wú)點(diǎn)i),'s'(U + 017F,拉丁文小 字母長(zhǎng)s)和'K'(U + 212A,開(kāi)爾文標(biāo)志)。 Spam 將匹配'Spam','spam','spAM'或'?pam'(后者僅在Unicode模式下匹配)。 此小寫(xiě)不考慮當(dāng)前區(qū)域設(shè)置; 如果您還設(shè)置了LOCALE標(biāo)志,它也會(huì)。

  • L

LOCALE

使得 \w,\W,\b 和 \B和大小寫(xiě)依賴當(dāng)前的語(yǔ)言(區(qū)域)環(huán)境,而不是 Unicode 數(shù)據(jù)庫(kù)。

區(qū)域設(shè)置是 C 語(yǔ)言的功能,主要作用是消除不同語(yǔ)言之間的差異。例如你正在處理的是法文文本,你想使用 \w+ 來(lái)匹配單詞,但是 \w 只是匹配 [A-Za-z] 中的單詞,并不會(huì)匹配那些法文特殊符號(hào)。python3已經(jīng)推薦使用Unicode,不建議使用LOCALE。

  • M

MULTILNE

通常 ^ 只匹配字符串的開(kāi)頭,而 $ 匹配字符串的結(jié)尾。該標(biāo)識(shí)設(shè)置時(shí),^ 不僅匹配字符串的開(kāi)頭,還匹配行首;$ 不僅匹配字符的結(jié)尾,還匹配行尾。

  • S

DOTALL

. 可以匹配任何字符,包括換行符。如果不使用這個(gè)標(biāo)志,. 將匹配除換行的所有字符。

  • A

ASCII
使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不是全Unicode匹配。這個(gè)標(biāo)識(shí)僅對(duì)Unicode模式有意義,并忽略字節(jié)模式。

  • X

VERBOSE

這個(gè)標(biāo)識(shí)使你的正則表達(dá)式可以寫(xiě)得更可讀靈活,空格會(huì)被忽略(除了出現(xiàn)在字符類中和使用反斜杠轉(zhuǎn)義的空格);同時(shí)允許你在正則表達(dá)式字符串使用注釋,# 符號(hào)后邊的內(nèi)容是注釋(除了出現(xiàn)在字符類中和使用反斜杠轉(zhuǎn)義的 #)。

下邊是使用 re.VERBOSE 的例子,:

charref = re.compile(r"""
 &[#]                # Start of a numeric entity reference
 (
     0[0-7]+         # Octal form
   | [0-9]+          # Decimal form
   | x[0-9a-fA-F]+   # Hexadecimal form
 )
 ;                   # Trailing semicolon
""", re.VERBOSE)

# 沒(méi)有注釋

charref = re.compile("&#(0[0-7]+"
                     "|[0-9]+"
                     "|x[0-9a-fA-F]+);")

參考資料

習(xí)題

1,下面關(guān)于python3 正則模式的說(shuō)哪些是錯(cuò)誤的?

A. match() 可以返回多個(gè)匹配
B. search() 必須從開(kāi)頭開(kāi)始匹配
C. findall() 以迭代器的形式返回
D. finditer() 以列表的形式返回

答案:ABCD

2,python3 正則表達(dá)式re.compile('spam', re.IGNORECASE)匹配哪些字符串?
A.'Spam' B. 'spam' C. 'spAM' D. '?pam' E.'pam'

答案:ABCD

更多關(guān)于模式

更多元字符

  • I

或操作符,對(duì)兩個(gè)正則表達(dá)式進(jìn)行操作。如果 A 和 B 是正則表達(dá)式,A | B 會(huì)匹配 A 或 B 中出現(xiàn)的任何字符。為了能夠更加合理的工作,| 的優(yōu)先級(jí)非常低。例如 Crow|Servo匹配'Crow'或'Servo',,而不是匹配'Cro'、 'w' 、'S'、'ervo'.。

同樣,我們使用 | 來(lái)匹配 '|' 字符本身;或者包含在一個(gè)字符類中,像這樣 [|] 。

  • ^

匹配字符串開(kāi)始。在 MULTILNE 中,每當(dāng)遇到換行符就會(huì)立刻進(jìn)行匹配。如果你只希望匹配位于字符串開(kāi)頭的單詞 From,那么你的正則表達(dá)式可以寫(xiě)為 ^From

>>> print(re.search('^From', 'From Here to Eternity'))  
<re.Match object; span=(0, 4), match='From'>
>>> print(re.search('^From', 'Reciting From Memory'))
None
  • $

匹配字符串的結(jié)束和行尾。

>>> print(re.search('}$', '{block}'))  
<re.Match object; span=(6, 7), match='}'>
>>> print(re.search('}$', '{block} '))
None
>>> print(re.search('}$', '{block}\n'))  
<re.Match object; span=(6, 7), match='}'>
  • A

匹配字符串開(kāi)始,如果沒(méi)有設(shè)置 MULTILINE 標(biāo)志的時(shí)候,\A 和 ^ 的功能是一樣的;但如果設(shè)置了 MULTILNE 標(biāo)志, ^ 會(huì)對(duì)字符串的每一行都進(jìn)行匹配。

  • Z

匹配字符串的結(jié)束。

  • b

單詞邊界,這是只匹配單詞的開(kāi)始和結(jié)尾的零寬斷言。單詞定義為字母數(shù)字的序列,所以單詞的結(jié)束指的是空格或者非字母數(shù)字的字符。

>>> p = re.compile(r'\bclass\b')
>>> print(p.search('no class at all'))
<re.Match object; span=(3, 8), match='class'>
>>> print(p.search('the declassified algorithm'))
None
>>> print(p.search('one subclass is'))
None

在使用這些特殊的序列的時(shí)候,有兩點(diǎn)是需要注意的:第一是Python 的字符串跟正則表達(dá)式在有些字符上是有沖突的。比如說(shuō)在 Python 中,\b 表示的是退格符,ASCII 碼值是 8。

下邊例子中,我們故意不寫(xiě)表示原始字符串的 'r',結(jié)果確實(shí)大相庭徑:

>>> p = re.compile('\bclass\b')
>>> print(p.search('no class at all'))
None
>>> print(p.search('\b' + 'class' + '\b'))
<re.Match object; span=(0, 7), match='\x08class\x08'>

第二點(diǎn)是在字符類中不能使用這個(gè)斷言。在字符類中,\b 只是用來(lái)表示退格符。

  • \B

與 \b 的含義相反,\B 表示非單詞邊界的位置。

分組

僅僅知道正則表達(dá)式是否匹配是不夠的,正則表達(dá)式通常使用分組的方式分別對(duì)不同內(nèi)容進(jìn)行匹配。

下例子將 RFC-822 頭用 “:” 號(hào)分成名字和值:

From: author@example.com
User-Agent: Thunderbird 1.5.0.9 (X11/20061227)
MIME-Version: 1.0
To: editor@example.com

先用正則表達(dá)式匹配整個(gè)RFC-822頭,使用一個(gè)組來(lái)匹配頭的名字,另一個(gè)組匹配名字對(duì)應(yīng)的值。

正則表達(dá)式使用元字符'(', ')' 來(lái)劃分組。'(', ')' 元字符跟數(shù)學(xué)表達(dá)式中的小括號(hào)含義差不多;它們將包含在內(nèi)部的表達(dá)式組合在一起,所以你可以對(duì)組的內(nèi)容使用重復(fù)操作的元字符,例如 *,+,? 或者 {m,n} 。

>>> p = re.compile('(ab)*')
>>> print(p.match('ababababab').span())
(0, 10)

用'(',')'表示的組也捕獲它們匹配的文本的起始和結(jié)束索引; 這可以通過(guò)將參數(shù)傳遞給ggroup(),start(),end() 和 span() 來(lái)檢索。 組從0開(kāi)始編號(hào)。組0始終存在; 它是整個(gè)RE,因此匹配對(duì)象方法都將組0作為其默認(rèn)參數(shù)。

>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'

子組從左到右進(jìn)行編號(hào),子組也允許嵌套,我們可以通過(guò)從左往右來(lái)統(tǒng)計(jì)左括號(hào) ( 來(lái)確定子組的序號(hào)。

>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'

group() 方法可傳入多個(gè)子組的序號(hào):

>>> m.group(2,1,2)
('b', 'abc', 'b')

groups() 方法一次性返回所有的子組匹配的字符串:

>>> m.groups()
('abc', 'b')

反引用可以在后面的位置使用先前匹配過(guò)的內(nèi)容,用法是反斜杠加上數(shù)字。例如 \1 表示引用前邊成功匹配的序號(hào)為 1 的子組。

>>> p = re.compile(r'\b(\w+)\s+\1\b')
>>> p.search('Paris in the the spring').group()
'the the'

習(xí)題

1, python3正則表達(dá)式compile('Crow|Servo')匹配哪些內(nèi)容:

A 'Crow' B 'foo。' C Servw' D 'Cro' E 'Serv' F 'Servo'

參考答案:A F

2, python3正則表達(dá)式要匹配'|',可以采用如下哪些方法:

A '||' B '|' C '[|]' D '$|'

參考答案:B C

3,關(guān)于python3正則表達(dá)式,下面哪些說(shuō)法是正確的

A re.findall(r'^From', 'From Here to Eternity\nFrom', re.MULTILINE) 返回長(zhǎng)度為2的列表
B re.findall(r'^From', 'From Here to Eternity\nFrom') 返回長(zhǎng)度為2的列表
C re.findall(r'^From', ' From Here to Eternity\nFrom', re.MULTILINE) 返回長(zhǎng)度為2的列表
D re.findall(r'\bFrom', ' From Here to Eternity\nFrom', re.MULTILINE) 返回長(zhǎng)度為2的列表

參考答案:A D

4,關(guān)于python3正則表達(dá)式,下面哪些說(shuō)法是正確的

A re.search(r'\bclass\b', 'no class at all')能成功匹配
B re.search('\bclass\b', 'no class at all')能成功匹配
C re.search(r'\bclass\b', 'no class at all')不能能成功匹配
D re.search('\bclass\b', 'no class at all')不能成功匹配

參考答案:A D

待整理: notepad++ 正則 http://docs.notepad-plus-plus.org/index.php/Regular_Expressions

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容