正則表達(dá)用來匹配字符串
正則表達(dá)式匹配過程
正則表達(dá)式語法規(guī)則
語法 | 說明 | 表達(dá)式實(shí)例 | 匹配字符串 |
字符 | |||
| . | 匹配除換行"/n"外的任意字符串 | abc | abc |
| / | 轉(zhuǎn)義字符,使后一個(gè)字符改變?cè)瓉淼囊馑?/td> | a//c | a/c |
| [...] | 字符集,對(duì)應(yīng)的位置可以是字符集中任意字符,字符集中的字符可以逐個(gè)列出,也可以給出范圍,如[abc]或[a-c]。第一個(gè)字符如果是^則表示取反,如[^abc]表示不是abc中的其他字符。所有的特殊的字符在字符集中都失去其原有的特殊含義。在字符集中使用^、]或-,可以使用轉(zhuǎn)義字符匹配它們 | a[bcd]e | abe ace ade |
預(yù)定義字符集 | |||
| /d | 數(shù)字:[0-9] | a/dc | a1c |
| /D | 非數(shù)字:[^0-9] | a/Dc | abc |
| /s | 空白字符:[<空格>/t/r/n/f/v] | a/sc | a c |
| /S | 非空白字符:[^/s] | a/Sc | abc |
| /w | 單詞字符:[a-zA-z0-9_] | a/wc | abc |
| /W | 非單詞字符:[^/w] | a/Wc | a c |
數(shù)量詞 | |||
| * | 匹配一個(gè)字符串0或無限次 | abc* | ab abc abccc |
| + | 匹配一個(gè)字符串1次或無限次 | abc+ | abc abccc |
| ? | 匹配一個(gè)字符串0次或1次 | abc? | ab abc |
| {m} | 匹配一個(gè)字符串m次 | abc{2} | abcc |
| {m,n} | 匹配一個(gè)字符串m到n次 | abc{2,3} | abcc abccc |
邊界匹配 | |||
| ^ | 匹配字符串開頭 | ^abc | abc |
| $ | 匹配字符串末尾 | abc$ | abc |
| /A | 匹配字符串開始 | /Aabc | abc |
| /Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串 | abc/Z | abc |
| /b | 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 | ||
| /B | 匹配非單詞邊界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 | ||
邏輯分組 | |||
| | | 匹配|表達(dá)式左右的任意一個(gè) | abc|def | abc def |
| (...) | 作為分組,每遇到一個(gè)(,分組編號(hào)加1,使用分組的好處是匹配的子串會(huì)保存到一個(gè)子組,便于以后使用 | (abc){2} | abcabc |
| (?P<name>...) | 分組除原有編號(hào)外,再加一個(gè)別名 | (?P<id>abc){2} | abcabc |
| /<number> | 引用編號(hào)為number的分組匹配到的字符串 | (/d)ab/1 | 1ab1 5ab5 |
| (?P=name) | 應(yīng)用別名為name的分組匹配到的字符串 | (?P<id>abc)ee(?P=name) | abceeabc |
特殊構(gòu)造(不分組) | |||
| (?:...) | (...)的不分組版本,用于|或后接數(shù)量詞 | (?:abc){2} | abcabc |
| (?iLmsux) | iLmsux中的每個(gè)字符代表正則表達(dá)式的一種匹配模式,只能用在正則表達(dá)式開頭,可選多個(gè) | (?i)abc | AbC |
| (?#...) | 將#后面的字符當(dāng)做注釋忽略 | abc(?#comment)def | abcdef |
| (?=...) | 之后的字符串表達(dá)式需要匹配才能成功,不消耗字符串內(nèi)容 | a(?=/d) | 后面是數(shù)字的a |
| (?!...) | 之后的字符串表達(dá)式需要不匹配才能成功,不消耗字符串內(nèi)容 | a(?!/d) | 后面不是數(shù)字的a |
| (?<=...) | 之前的字符串表達(dá)式需要匹配才能成功,不消耗字符串內(nèi)容 | (?<=/d)a | 前面是數(shù)字的a |
| (?<!...) | 之前的字符串表達(dá)式需要不匹配才能成功,不消耗字符串內(nèi)容 | (?<!/d)a | 前面不是數(shù)字的a |
| (?(id/name)yes_ pattern|no_parttern) | 如果匹配到分組為id或別名name的字符串成功匹配,則需要匹配yes_pattern 不成功,怎需要匹配no_pattern | (/d)abc(?(1)/d|def) | 1abc3 abcdef |
貪婪模式和非貪婪模式
貪婪模式是盡可能多的匹配字符串,python默認(rèn)為貪婪模式,非貪婪模式盡可能少的匹配字符串,在正則表達(dá)式后面加個(gè)?表示非貪婪模式。例如:字符串a(chǎn)bcccb,貪婪模式正則表達(dá)式為ab.*c,非貪婪模式的正則表達(dá)式為ab.*?c,貪婪模式結(jié)果為abccc,非貪婪模式結(jié)果為abc,再比如字符串a(chǎn)bbb,貪婪模式正則表達(dá)式為ab?,非貪婪模式正則表達(dá)為ab??,貪婪模式結(jié)果為ab,非貪婪結(jié)果為a。
python的re模塊
re模塊的方法:
1.compile(pattern[,flag]):對(duì)正則表達(dá)式pattern進(jìn)行編譯,編譯后比直接查找速度快
2.match(patter,string[,flag]):從字符串string的開始就匹配,若匹配成功,則返回匹配對(duì)象,否則返回None(None對(duì)象沒有g(shù)roup()和groups()方法,不判斷直接調(diào)用這兩個(gè)方法,則會(huì)出現(xiàn)異常)
3.search(pattern,string[,flag]):從字符串中查找,若匹配成功,則返回匹配對(duì)象,否則返回None
4.findall(pattern,string[,flag]):在字符串 string 中查找正則表達(dá)式模式 pattern 的所有(非重復(fù))出現(xiàn);返回一個(gè)匹配對(duì)象的列表
5.finditer(pattern,string[, flags])b 和 findall()相同,但返回的不是列表而是迭代器;對(duì)于每個(gè)匹配,該迭代器返回一個(gè)匹配對(duì)象
6.split(pattern,string, max=0) 根據(jù)正則表達(dá)式 pattern 中的分隔符把字符 string 分割為一個(gè)列表,返回成功匹配的列表,最多分割 max 次(默認(rèn)是分割所有匹配的地方)
7.sub(pattern, repl, string, max=0) 把字符串 string 中所有匹配正則表達(dá)式 pattern 的地方替換成字符串 repl,如果 max 的值沒有給出, 則對(duì)所有匹配的地方進(jìn)行替換
匹配對(duì)象的方法和屬性:
參數(shù)flag:
| re.I | 使匹配對(duì)大小寫不敏感 |
| re.L | 做本地化識(shí)別(locale-aware)匹配 |
| re.M | 多行匹配,影響 ^ 和 $ |
| re.S | 使 . 匹配包括換行在內(nèi)的所有字符 |
| re.U | 根據(jù)Unicode字符集解析字符。這個(gè)標(biāo)志影響 /w, /W, /b, /B. |
| re.X | 該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫得更易于理解。 |
python使用正則表達(dá)式的例子
>>> import re>>> pattern = re.compile(r'foo')>>> res1 = re.search(pattern,'foo')>>> res1.group() # 返回的是匹配對(duì)象,需要調(diào)用group()方法,顯示所有的匹配對(duì)象'foo'>>> res1.groups()# 因?yàn)闆]有子組(即正則表達(dá)式中沒有分組),返回空元組()>>> res2 = re.findall(pattern,'foobbfoo')>>> res2 # 直接返回的是一個(gè)列表,包含所有匹配的字符['foo', 'foo']>>> pattern2 = re.compile(r'(/d+)aa')>>> res3 = re.search(pattern2,'bb32aa')>>> res3.group() # 返回所有的匹配的對(duì)象'32aa'>>> res3.groups() # 對(duì)比res1的groups(),正則里有分組,返回匹配到的分組('32',)>>> res4 = re.findall(pattern2,'bb32aacc5aacc')>>> res4 # 對(duì)比res2,返回一個(gè)列表,但只包含所匹配分組里面的字符,['32', '5']總結(jié)
以上所述是小編給大家介紹的python正則表達(dá)式及使用正則表達(dá)式的例子,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選