您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python中re模塊的元字符怎么使用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Python中re模塊的元字符怎么使用”文章能幫助大家解決問(wèn)題。
元字符(Meta Characters)是正則表達(dá)式中具有特殊意義的專用字符,在Python中也不例外,是用來(lái)指明前導(dǎo)字符(位于元字符前的字符)在目標(biāo)對(duì)象中的出現(xiàn)模式。
在正則表達(dá)式中,方括號(hào) ( [] ) 中指定的一組字符組成一個(gè)字符類。
# 元字符序列匹配類中的任何單個(gè)字符 >>> s = 'foo123bar' # 3個(gè)任意連續(xù)字符匹配 >>> re.search('[0-9][0-9][0-9]', s) <_sre.SRE_Match object; span=(3, 6), match='123'> >>> re.search('[0-9][0-9][0-9]', 'foo456bar') <_sre.SRE_Match object; span=(3, 6), match='456'> >>> re.search('[0-9][0-9][0-9]', '234baz') <_sre.SRE_Match object; span=(0, 3), match='234'> >>> re.search('[0-9][0-9][0-9]', 'qux678') <_sre.SRE_Match object; span=(3, 6), match='678'> # 匹配不上的情況 >>> print(re.search('[0-9][0-9][0-9]', '12foo34')) None
通配符點(diǎn) ( . ) 元字符匹配除換行符以外的任何字符。
>>> s = 'foo123bar' >>> re.search('1.3', s) <_sre.SRE_Match object; span=(3, 6), match='123'> >>> s = 'foo13bar' >>> print(re.search('1.3', s)) None
re模塊支持的元字符
下面列表都是元字符的描述,對(duì)元字符進(jìn)行分類描述方便記憶。 這個(gè)要是看不懂直接看跳過(guò)看下面的例子。
字符 | 描述 |
---|---|
\ | 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè) 向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,‘n’ 匹配字符 “n”。‘\n’ 匹配一個(gè)換行符。序列 ‘\’ 匹配 “” 而 “(” 則匹配 “(”。 |
^ | 匹配輸入字符串的開(kāi)始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ | 匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
* | 匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價(jià)于{0,}。 |
+ | 匹配前面的子表達(dá)式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價(jià)于 {1,}。 |
? | 匹配前面的子表達(dá)式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等價(jià)于 {0,1}。 |
{n} | n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個(gè) o。 |
{n,} | n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等價(jià)于 ‘o+’。‘o{0,}’ 則等價(jià)于 ‘o*’。 |
{n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 將匹配 “fooooood” 中的前三個(gè) o。‘o{0,1}’ 等價(jià)于 ‘o?’。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。 |
? | 當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串 “oooo”,‘o+?’ 將匹配單個(gè) “o”,而 ‘o+’ 將匹配所有 ‘o’。 |
. | 匹配除換行符(\n、\r)之外的任何單個(gè)字符。要匹配包括 ‘\n’ 在內(nèi)的任何字符,請(qǐng)使用像"(. |
x|y | 匹配 x 或 y。例如,'z |
[xyz] | 字符集合。匹配所包含的任意一個(gè)字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^xyz] | 負(fù)值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。 |
[a-z] | 字符范圍。匹配指定范圍內(nèi)的任意字符。例如,‘[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范圍內(nèi)的任意小寫(xiě)字母字符。 |
[^a-z] | 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,‘[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范圍內(nèi)的任意字符。 |
\b | 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\cx | 匹配由 x 指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 ‘c’ 字符。 |
\d | 匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。 |
\D | 匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。 |
\f | 匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL。 |
\n | 匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。 |
\r | 匹配一個(gè)回車符。等價(jià)于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。 |
\t | 匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。 |
\v | 匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。 |
\w | 匹配字母、數(shù)字、下劃線。等價(jià)于’[A-Za-z0-9_]'。 |
\W | 匹配非字母、數(shù)字、下劃線。等價(jià)于 ‘[^A-Za-z0-9_]’。 |
\xn | 匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如,‘\x41’ 匹配 “A”。‘\x041’ 則等價(jià)于 ‘\x04’ & “1”。正則表達(dá)式中可以使用 ASCII 編碼。 |
\num | 匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,‘(.)\1’ 匹配兩個(gè)連續(xù)的相同字符。 |
\n | 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果 \n 之前至少 n 個(gè)獲取的子表達(dá)式,則 n 為向后引用。否則,如果 n 為八進(jìn)制數(shù)字 (0-7),則 n 為一個(gè)八進(jìn)制轉(zhuǎn)義值。 |
\nm | 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果 \nm 之前至少有 nm 個(gè)獲得子表達(dá)式,則 nm 為向后引用。如果 \nm 之前至少有 n 個(gè)獲取,則 n 為一個(gè)后跟文字 m 的向后引用。如果前面的條件都不滿足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 \nm 將匹配八進(jìn)制轉(zhuǎn)義值 nm。 |
\nml | 如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字 (0-7),則匹配八進(jìn)制轉(zhuǎn)義值 nml。 |
\un | 匹配 n,其中 n 是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的 Unicode 字符。例如, \u00A9 匹配版權(quán)符號(hào) (?)。 |
指定要匹配的特定字符集。 字符類元字符序列將匹配該類中包含的任何單個(gè)字符。
# 元字符序列[artz]匹配任何單個(gè)'a'、'r'、't'或'z'字符 # ba[artz]同時(shí)匹配'bar'and 'baz'(也將匹配'baa'and 'bat')。 >>> re.search('ba[artz]', 'foobarqux') <_sre.SRE_Match object; span=(3, 6), match='bar'> >>> re.search('ba[artz]', 'foobazqux') <_sre.SRE_Match object; span=(3, 6), match='baz'>
匹配和[a-z]之間的任何小寫(xiě)字母字符。
>>> re.search('[a-z]', 'FOObar') <_sre.SRE_Match object; span=(3, 4), match='b'>
匹配和[0-9]之間任何數(shù)字字符。
>>> re.search('[0-9][0-9]', 'foo123bar') <_sre.SRE_Match object; span=(3, 5), match='12'>
[0-9a-fA-F]匹配任何十六進(jìn)制數(shù)字字符。
>>> re.search('[0-9a-fA-f]', '--- a0 ---') <_sre.SRE_Match object; span=(4, 5), match='a'>
[^0-9]匹配任何不是數(shù)字的字符開(kāi)頭的字符。
>>> re.search('[^0-9]', '12345foo') <_sre.SRE_Match object; span=(5, 6), match='f'>
如果一個(gè)^字符出現(xiàn)在字符類中但不是第一個(gè)字符則無(wú)結(jié)果。
>>> re.search('[#:^]', 'foo^bar:baz#qux') <_sre.SRE_Match object; span=(3, 4), match='^'>
可以通過(guò)用連字符分隔字符來(lái)指定字符類中的字符范圍,可以將其作為第一個(gè)或最后一個(gè)字符放置,或者使用反斜杠 ( \ ) 對(duì)其進(jìn)行轉(zhuǎn)義。
# 直接查找符號(hào) >>> re.search('[-abc]', '123-456') <_sre.SRE_Match object; span=(3, 4), match='-'> >>> re.search('[abc-]', '123-456') <_sre.SRE_Match object; span=(3, 4), match='-'> >>> re.search('[ab\-c]', '123-456') <_sre.SRE_Match object; span=(3, 4), match='-'> # 查找轉(zhuǎn)義符號(hào) >>> re.search('[]]', 'foo[1]') <_sre.SRE_Match object; span=(5, 6), match=']'> >>> re.search('[ab\]cd]', 'foo[1]') <_sre.SRE_Match object; span=(5, 6), match=']'> # [ ] 內(nèi)的元字符失去意義轉(zhuǎn)義成字符處理 >>> re.search('[)*+|]', '123*456') <_sre.SRE_Match object; span=(3, 4), match='*'> >>> re.search('[)*+|]', '123+456') <_sre.SRE_Match object; span=(3, 4), match='+'>
匹配除換行符以外的任何單個(gè)字符。
>>> re.search('foo.bar', 'fooxbar') <_sre.SRE_Match object; span=(0, 7), match='fooxbar'> >>> print(re.search('foo.bar', 'foobar')) None >>> print(re.search('foo.bar', 'foo\nbar')) None >>> print(re.search('foo.bar', 'foosbar')) <_sre.SRE_Match object; span=(0, 7), match='foosbar'>
\w匹配任何字母數(shù)字字符,單詞字符是大寫(xiě)和小寫(xiě)字母、數(shù)字和下劃線 ( _) 字符。
\w 等于 [a-zA-Z0-9_] 。
>>> re.search('\w', '#(.a$@&') <_sre.SRE_Match object; span=(3, 4), match='a'> >>> re.search('[a-zA-Z0-9_]', '#(.a$@&') <_sre.SRE_Match object; span=(3, 4), match='a'>
\W是相反的。它匹配任何非單詞字符。
\W 等于 [^a-zA-Z0-9_] 。
>>> re.search('\W', 'a_1*3Qb') <_sre.SRE_Match object; span=(3, 4), match='*'> >>> re.search('[^a-zA-Z0-9_]', 'a_1*3Qb') <_sre.SRE_Match object; span=(3, 4), match='*'>
\d匹配任何十進(jìn)制數(shù)字字符,等價(jià)于[0-9]。
>>> re.search('\d', 'abc4def') <_sre.SRE_Match object; span=(3, 4), match='4'>
\D匹配任何不是十進(jìn)制數(shù)字的字符,等價(jià)于[^0-9]。
>>> re.search('\D', '234Q678') <_sre.SRE_Match object; span=(3, 4), match='Q'>
\s匹配任何空白字符,同時(shí)也匹配換行符。
>>> re.search('\s', 'foo\nbar baz') <_sre.SRE_Match object; span=(3, 4), match='\n'>
\S匹配任何不是空格的字符。
>>> re.search('\S', ' \n foo \n ') <_sre.SRE_Match object; span=(4, 5), match='f'>
字符類序列\(zhòng)w, \W, \d, \D, \s, 和\S也可以出現(xiàn)在方括號(hào)字符類中。
# [\d\w\s]匹配任何數(shù)字、單詞或空白字符 >>> re.search('[\d\w\s]', '---3---') <_sre.SRE_Match object; span=(3, 4), match='3'> >>> re.search('[\d\w\s]', '---a---') <_sre.SRE_Match object; span=(3, 4), match='a'> >>> re.search('[\d\w\s]', '--- ---') <_sre.SRE_Match object; span=(3, 4), match=' '> # 由于\w包含\d,相同的字符類也可以表示為略短[\w\s] >>> re.search('[\w\s]', '---a---') <_sre.SRE_Match object; span=(3, 4), match='a'> >>> re.search('[\w\s]', '---a---') <_sre.SRE_Match object; span=(3, 4), match='a'> >>> re.search('[\w\s]', '--- ---') <_sre.SRE_Match object; span=(3, 4), match=' '>
反斜杠會(huì)刪除元字符的特殊含義。
>>> re.search('.', 'foo.bar') <_sre.SRE_Match object; span=(0, 1), match='f'> >>> re.search('\.', 'foo.bar') # 非通配符 <_sre.SRE_Match object; span=(3, 4), match='.'> >>> re.search(r'\\', 'foo\bar') <_sre.SRE_Match object; span=(3, 4), match='\\'>
不匹配搜索字符串中的任何實(shí)際字符,并且在解析期間它們不使用任何搜索字符串。指示搜索字符串中必須發(fā)生匹配的特定位置。
^ 和 \A 字符串的開(kāi)頭匹配項(xiàng)
>>> re.search('^foo', 'foobar') <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> print(re.search('^foo', 'barfoo')) None >>> re.search('\Afoo', 'foobar') <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> print(re.search('\Afoo', 'barfoo')) None
>>> re.search('bar$', 'foobar') <_sre.SRE_Match object; span=(3, 6), match='bar'> >>> print(re.search('bar$', 'barfoo')) None >>> re.search('bar\Z', 'foobar') <_sre.SRE_Match object; span=(3, 6), match='bar'> >>> print(re.search('bar\Z', 'barfoo')) None # 特殊$也在搜索字符串末尾的單個(gè)換行符之前匹配 >>> re.search('bar$', 'foobar\n') <_sre.SRE_Match object; span=(3, 6), match='bar'>
\b 必須在單詞的開(kāi)頭或結(jié)尾。
# 單詞開(kāi)頭 >>> re.search(r'\bbar', 'foo bar') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> re.search(r'\bbar', 'foo.bar') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> print(re.search(r'\bbar', 'foobar')) None # 單詞結(jié)尾 >>> re.search(r'foo\b', 'foo bar') <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> re.search(r'foo\b', 'foo.bar') <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> print(re.search(r'foo\b', 'foobar')) None # 單詞居中 >>> re.search(r'\bbar\b', 'foo bar baz') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> re.search(r'\bbar\b', 'foo(bar)baz') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> print(re.search(r'\bbar\b', 'foobarbaz')) None
\B 不能在單詞的開(kāi)頭或結(jié)尾。
>>> print(re.search(r'\Bfoo\B', 'foo')) None >>> print(re.search(r'\Bfoo\B', '.foo.')) None >>> re.search(r'\Bfoo\B', 'barfoobaz') <_sre.SRE_Match object; span=(3, 6), match='foo'>
該部分必須出現(xiàn)多少次才能使匹配成功。
>>> re.search('foo-*bar', 'foobar') <_sre.SRE_Match object; span=(0, 6), match='foobar'> >>> re.search('foo-*bar', 'foo-bar') <_sre.SRE_Match object; span=(0, 7), match='foo-bar'> >>> re.search('foo-*bar', 'foo--bar') <_sre.SRE_Match object; span=(0, 8), match='foo--bar'>
匹配2個(gè)字符中全部的內(nèi)容。
>>> re.search('foo.*bar', '# foo jklasajk#*(@ bar #') <_sre.SRE_Match object; span=(2, 22), match='foo jklasajk#*(@ bar'>
>>> print(re.search('foo-+bar', 'foobar')) None >>> re.search('foo-+bar', 'foo-bar') <_sre.SRE_Match object; span=(0, 7), match='foo-bar'> >>> re.search('foo-+bar', 'foo--bar') <_sre.SRE_Match object; span=(0, 8), match='foo--bar'>
>>> re.search('foo-?bar', 'foobar') <_sre.SRE_Match object; span=(0, 6), match='foobar'> >>> re.search('foo-?bar', 'foo-bar') <_sre.SRE_Match object; span=(0, 7), match='foo-bar'> >>> print(re.search('foo-?bar', 'foo--bar')) None
加問(wèn)號(hào)則表示為最小長(zhǎng)度匹配的懶惰模式。
### + 和 +? 代替了 * 和 *? # .*全匹配貪婪模式 >>> re.search('<.*>', '%<foo> <bar> <baz>%') <_sre.SRE_Match object; span=(1, 18), match='<foo> <bar> <baz>'> # *? 前一個(gè)字符0次或無(wú)限次擴(kuò)展,最小匹配 >>> re.search('<.*?>', '%<foo> <bar> <baz>%') <_sre.SRE_Match object; span=(1, 6), match='<foo>'> # .+ 前一個(gè)字符1次或無(wú)限次擴(kuò)展,最小匹配 >>> re.search('<.+>', '%<foo> <bar> <baz>%') <_sre.SRE_Match object; span=(1, 18), match='<foo> <bar> <baz>'> # .+? 前一個(gè)字符1次或無(wú)限次擴(kuò)展,最小匹配 >>> re.search('<.+?>', '%<foo> <bar> <baz>%') <_sre.SRE_Match object; span=(1, 6), match='<foo>'> # ? 匹配懶惰模式 >>> re.search('ba?', 'baaaa') <_sre.SRE_Match object; span=(0, 2), match='ba'> # ?? 前一個(gè)字符0次或1次擴(kuò)展,最小匹配 >>> re.search('ba??', 'baaaa') <_sre.SRE_Match object; span=(0, 1), match='b'>
>>> print(re.search('x-{3}x', 'x--x')) None >>> re.search('x-{3}x', 'x---x') <_sre.SRE_Match object; span=(0, 5), match='x---x'> >>> print(re.search('x-{3}x', 'x----x')) None
>>> for i in range(1, 6): ... s = f"x{'-' * i}x" ... print(f'{i} {s:10}', re.search('x-{2,4}x', s)) ... 1 x-x None 2 x--x <_sre.SRE_Match object; span=(0, 4), match='x--x'> 3 x---x <_sre.SRE_Match object; span=(0, 5), match='x---x'> 4 x----x <_sre.SRE_Match object; span=(0, 6), match='x----x'> 5 x-----x None
正則表達(dá)式 | 匹配說(shuō)明 | 相同語(yǔ)法 |
---|---|---|
< regex > {,n} | 任何小于或等于的重復(fù)次數(shù)n | < regex > {0,n} |
< regex > {m,} | 任何大于或等于的重復(fù)次數(shù)m | ---- |
< regex > {,} | 任意次數(shù)的重復(fù) | < regex > {0,} , < regex > * |
>>> re.search('x{}y', 'x{}y') <_sre.SRE_Match object; span=(0, 4), match='x{}y'> >>> re.search('x{foo}y', 'x{foo}y') <_sre.SRE_Match object; span=(0, 7), match='x{foo}y'> >>> re.search('x{a:b}y', 'x{a:b}y') <_sre.SRE_Match object; span=(0, 7), match='x{a:b}y'> >>> re.search('x{1,3,5}y', 'x{1,3,5}y') <_sre.SRE_Match object; span=(0, 9), match='x{1,3,5}y'> >>> re.search('x{foo,bar}y', 'x{foo,bar}y') <_sre.SRE_Match object; span=(0, 11), match='x{foo,bar}y'>
非貪婪(懶惰)版本 {m,n}。
>>> re.search('a{3,5}', 'aaaaaaaa') <_sre.SRE_Match object; span=(0, 5), match='aaaaa'> >>> re.search('a{3,5}?', 'aaaaaaaa') <_sre.SRE_Match object; span=(0, 3), match='aaa'>
分組構(gòu)造將 Python 中的正則表達(dá)式分解為子表達(dá)式或組。
分組:一個(gè)組代表一個(gè)單一的句法實(shí)體。附加元字符作為一個(gè)單元應(yīng)用于整個(gè)組。
捕獲:一些分組結(jié)構(gòu)還捕獲與組中的子表達(dá)式匹配的搜索字符串部分??梢酝ㄟ^(guò)幾種不同的機(jī)制檢索捕獲的匹配項(xiàng)。
(<regex>),定義子表達(dá)式或組。
# 括號(hào)中的正則表達(dá)式僅匹配括號(hào)的內(nèi)容 >>> re.search('(bar)', 'foo bar baz') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> re.search('bar', 'foo bar baz') <_sre.SRE_Match object; span=(4, 7), match='bar'>
組后面的量詞元字符對(duì)組中指定的整個(gè)子表達(dá)式作為一個(gè)單元進(jìn)行操作。
# 元字符+僅適用于字符'r','ba'隨后出現(xiàn)一次或多次'r'。 >>> re.search('bar+', 'foo bar baz') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> re.search('(bar)+', 'foo bar baz') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> re.search('(bar)+', 'foo barbar baz') <_sre.SRE_Match object; span=(4, 10), match='barbar'> >>> re.search('(bar)+', 'foo barbarbarbar baz') <_sre.SRE_Match object; span=(4, 16), match='barbarbarbar'>
正則表達(dá)式 | 解釋 | 匹配說(shuō)明 | 例子 |
---|---|---|---|
bar+ | 元字符+僅適用于字符’r’。 | ‘ba’隨后出現(xiàn)一次或多次’r’ | bar、barr、barrr等 |
(bar)+ | 元字符+適用于整個(gè)字符串’bar’。 | 出現(xiàn)一次或多次’bar’ | bar、barbar、barbarbar |
返回一個(gè)元組,其中包含從正則表達(dá)式匹配中捕獲的所有組。
>>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz') >>> m <_sre.SRE_Match object; span=(0, 12), match='foo:quux:baz'> >>> m.groups() ('foo', 'quux', 'baz')
返回包含<n>捕獲的匹配項(xiàng)的字符串。
>>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz') >>> m.groups() ('foo', 'quux', 'baz') >>> m.group(0) ('foo', 'quux', 'baz') >>> m.group(1) 'foo' >>> m.group(2) 'quux' >>> m.group(3) 'baz'
返回一個(gè)包含指定捕獲匹配序號(hào)的元組。
>>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz') >>> m.groups() ('foo', 'quux', 'baz') >>> m.group(2, 3) ('quux', 'baz') >>> m.group(3, 2, 1) ('baz', 'quux', 'foo')
>>> regex = r'(\w+),\1' >>> m = re.search(regex, 'foo,foo') >>> m <_sre.SRE_Match object; span=(0, 7), match='foo,foo'> >>> m.group(1) 'foo' >>> m = re.search(regex, 'qux,qux') >>> m <_sre.SRE_Match object; span=(0, 7), match='qux,qux'> >>> m.group(1) 'qux' >>> m = re.search(regex, 'foo,qux') >>> print(m) None
>>> m = re.search('(?P<w1>\w+),(?P<w2>\w+),(?P<w3>\w+)', 'foo,quux,baz') >>> m.groups() ('foo', 'quux', 'baz') >>> m.group('w1') 'foo' >>> m.group('w3') 'baz' >>> m.group('w1', 'w2', 'w3') ('foo', 'quux', 'baz') >>> m.group(1, 2, 3) ('foo', 'quux', 'baz')
>>> m = re.search(r'(\w+),\1', 'foo,foo') >>> m <_sre.SRE_Match object; span=(0, 7), match='foo,foo'> >>> m.group(1) 'foo' >>> m = re.search(r'(?P<word>\w+),(?P=word)', 'foo,foo') >>> m <_sre.SRE_Match object; span=(0, 7), match='foo,foo'> >>> m.group('word') 'foo'
>>> m = re.search('(\w+),(?:\w+),(\w+)', 'foo,quux,baz') >>> m.groups() ('foo', 'baz') >>> m.group(1) 'foo' >>> m.group(2) 'baz'
(?(<n>)<yes-regex>|<no-regex>)
(?(<name>)<yes-regex>|<no-regex>)
# ^(###)?表示搜索字符串可選地以 . 開(kāi)頭'###'。如果是這樣,那么周圍的分組括號(hào)###將創(chuàng)建一個(gè)編號(hào)為的組1。否則,不會(huì)存在這樣的組 # foo字面上匹配字符串'foo' # (?(1)bar|baz)匹配'bar'組是否1存在和'baz'不存在 regex = r'^(###)?foo(?(1)bar|baz)' # 搜索字符串'###foobar'確實(shí)以 開(kāi)頭'###',因此解析器創(chuàng)建了一個(gè)編號(hào)為 的組1。然后條件匹配是針對(duì)'bar'匹配的 >>> re.search(regex, '###foobar') <_sre.SRE_Match object; span=(0, 9), match='###foobar'> # 搜索字符串'###foobaz'確實(shí)以 開(kāi)頭'###',因此解析器創(chuàng)建了一個(gè)編號(hào)為 的組1。然后條件匹配是反對(duì)'bar',不匹配。 >>> print(re.search(regex, '###foobaz')) None # 搜索字符串'foobar'不以 開(kāi)頭'###',因此沒(méi)有編號(hào)為 的組1。然后條件匹配是反對(duì)'baz',不匹配。 >>> print(re.search(regex, 'foobar')) None # 搜索字符串'foobaz'不以 開(kāi)頭'###',因此沒(méi)有編號(hào)為 的組1。然后條件匹配是針對(duì)'baz'匹配的。 >>> re.search(regex, 'foobaz') <_sre.SRE_Match object; span=(0, 6), match='foobaz'>
根據(jù)解析器在搜索字符串中當(dāng)前位置的后面(左側(cè))或前面(右側(cè))來(lái)確定 Python 中正則表達(dá)式匹配的成功或失敗。(?=<lookahead_regex>) 積極前瞻斷言
# 斷言正則表達(dá)式解析器當(dāng)前位置之后的內(nèi)容必須匹配 # 前瞻斷言(?=[a-z])指定后面的'foo'必須是小寫(xiě)字母字符。 >>> re.search('foo(?=[a-z])', 'foobar') <_sre.SRE_Match object; span=(0, 3), match='foo'> # 前瞻失敗的例子,foo的下一個(gè)字符是'1' >>> print(re.search('foo(?=[a-z])', 'foo123')) None # 前瞻的獨(dú)特之處<lookahead_regex>在于不消耗搜索字符串中匹配的部分,并且它不是返回的匹配對(duì)象的一部分。 >>> re.search('foo(?=[a-z])', 'foobar') <_sre.SRE_Match object; span=(0, 3), match='foo'> # 舉例對(duì)比觀察,?=斷言的區(qū)別 >>> m = re.search('foo(?=[a-z])(?P<ch>.)', 'foobar') >>> m.group('ch') 'b' >>> m = re.search('foo([a-z])(?P<ch>.)', 'foobar') >>> m.group('ch') 'a'
# 例子和之前的前瞻積極斷言相反 >>> re.search('foo(?=[a-z])', 'foobar') <_sre.SRE_Match object; span=(0, 3), match='foo'> >>> print(re.search('foo(?![a-z])', 'foobar')) None >>> print(re.search('foo(?=[a-z])', 'foo123')) None >>> re.search('foo(?![a-z])', 'foo123') <_sre.SRE_Match object; span=(0, 3), match='foo'>
# 斷言正則表達(dá)式解析器當(dāng)前位置之前的內(nèi)容匹配 # 斷言指定'foo'必須先于'bar' >>> re.search('(?<=foo)bar', 'foobar') <_sre.SRE_Match object; span=(3, 6), match='bar'> >>> print(re.search('(?<=qux)bar', 'foobar')) None
# 例子和之前的向后積極斷言相反 >>> print(re.search('(?<!foo)bar', 'foobar')) None >>> re.search('(?<!qux)bar', 'foobar') <_sre.SRE_Match object; span=(3, 6), match='bar'>
# 正則表達(dá)式解析器忽略(?#...)序列中包含的任何內(nèi)容 >>> re.search('bar(?#This is a comment) *baz', 'foo bar baz qux') <_sre.SRE_Match object; span=(4, 11), match='bar baz'>
# 形式的表達(dá)式最多匹配一個(gè)指定的表達(dá)式:<regex1>|<regex2>|...|<regexn><regexi> >>> re.search('foo|bar|baz', 'bar') <_sre.SRE_Match object; span=(0, 3), match='bar'> >>> re.search('foo|bar|baz', 'baz') <_sre.SRE_Match object; span=(0, 3), match='baz'> >>> print(re.search('foo|bar|baz', 'quux')) None # 結(jié)合交替、分組和任何其他元字符來(lái)實(shí)現(xiàn)您需要的任何復(fù)雜程度。 # (foo|bar|baz)+表示一個(gè)或多個(gè)字符串 >>> re.search('(foo|bar|baz)+', 'foofoofoo') <_sre.SRE_Match object; span=(0, 9), match='foofoofoo'> >>> re.search('(foo|bar|baz)+', 'bazbazbazbaz') <_sre.SRE_Match object; span=(0, 12), match='bazbazbazbaz'> >>> re.search('(foo|bar|baz)+', 'barbazfoo') <_sre.SRE_Match object; span=(0, 9), match='barbazfoo'> # ([0-9]+|[a-f]+)表示一個(gè)或多個(gè)十進(jìn)制數(shù)字字符的序列或一個(gè)或多個(gè)'a-f'字符的序列 >>> re.search('([0-9]+|[a-f]+)', '456') <_sre.SRE_Match object; span=(0, 3), match='456'> >>> re.search('([0-9]+|[a-f]+)', 'ffda') <_sre.SRE_Match object; span=(0, 4), match='ffda'>
關(guān)于“Python中re模塊的元字符怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。