最近經(jīng)常會(huì)碰到正則表達(dá)式,以前雖然也會(huì)寫一些,也能夠看懂,但畢竟沒(méi)有系統(tǒng)的研究過(guò),用的時(shí)候還是需要常常google。
趁這個(gè)機(jī)會(huì),進(jìn)行總結(jié)和筆記,希望以后查資料就看自己的文章就夠了,不用到處google。
作用
正則表達(dá)式的作用,在于描述一類字符串,常用于匹配和檢索。
正則表達(dá)式不是萬(wàn)能的,并不能匹配全部的字符串,看名字就知道,還有非正則字符串。
常用語(yǔ)法
| 預(yù)定義字符 | 含義 |
|---|---|
| \d | 數(shù)字:[0-9] |
| \D | 非數(shù)字:[^\d] |
| \s | 空白字符:[<空格>\t\r\n\f\v] |
| \S | 非空白字符:[^\s] |
| \w | 單詞字符:[A-Za-z0-9] |
| \W | 非單詞字符:[^\w] |
| 普通字符 | 含義 |
|---|---|
| . | 匹配任意換行符"\n"外的字符 |
| abc | 匹配字符本身 |
| 特殊字符 | 匹配特殊字符,前面加\匹配 |
| 數(shù)量字符 | 含義 |
|---|---|
| * | 匹配前一個(gè)字符0或無(wú)限次 |
| + | 匹配前一個(gè)字符1或無(wú)限次 |
| ? | 匹配前一個(gè)字符0或1次 |
| {m,n} | 匹配前一個(gè)字符m到n次,m和n可省略 |
| {m,n}?、*?等 | 非貪婪模式,數(shù)量字符都是貪婪的,它們會(huì)盡可能多的匹配文字,在它們的后面加上一個(gè)?就可以實(shí)現(xiàn)非貪婪或最小匹配匹配特殊字符 |
| 分組 | 含義 |
|---|---|
| [] | 字符集,表示對(duì)應(yīng)位置可以是字符集中任意字符 |
| | | 或,表示左右表達(dá)式任意匹配一個(gè),匹配時(shí)短路 |
| () | 分組,從左邊開(kāi)始,我一個(gè)分組,編號(hào)+1 |
| \<number> | 引用編號(hào)為<number>的分組 |
python的re模塊
在python中引用re模塊即可在python中使用正則表達(dá)式import re。
正則對(duì)象
re模塊中,需要把一個(gè)正則字符串轉(zhuǎn)換成正則表達(dá)式對(duì)象,然后使用該對(duì)象去執(zhí)行匹配和替換等操作。
使用pattern = re.compile(r're_string')把一個(gè)正則字符串re_string轉(zhuǎn)換成正則對(duì)象pattern,在這里建議使用python中的原字符串模式r'...'填入字符串,可以避免很多轉(zhuǎn)義問(wèn)題。
有兩個(gè)常用的對(duì)象屬性,pattern. pattern和pattern.groups,分別輸出對(duì)象的匹配字符和分組個(gè)數(shù)。
匹配對(duì)象
在執(zhí)行中,如果不想創(chuàng)建一個(gè)pattern,則可以直接使用match = re.match(r're_string','string') 來(lái)匹配。
返回值match就是正則的匹配對(duì)象,若沒(méi)有匹配,返回None。
match也有很多屬性和方法,比較常用的有
屬性:
- string: 匹配時(shí)使用的文本。
- re: 匹配時(shí)使用的Pattern對(duì)象。
- pos: 文本中正則表達(dá)式開(kāi)始搜索的索引。值與Pattern.match()和 Pattern.seach()方法的同名參數(shù)相同。
- endpos: 文本中正則表達(dá)式結(jié)束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
- lastindex: 最后一個(gè)被捕獲的分組在文本中的索引。如果沒(méi)有被捕獲的分組,將為None。
- lastgroup: 最后一個(gè)被捕獲的分組的別名。如果這個(gè)分組沒(méi)有別名或者沒(méi)有被捕獲的分組,將為None。
方法:
- group([group1, …]):
獲得一個(gè)或多個(gè)分組截獲的字符串;指定多個(gè)參數(shù)時(shí)將以元組形式返回。group1可以使用編號(hào)也可以使用別名;編號(hào)0代表整個(gè)匹配的子串;不填寫參數(shù)時(shí),返回group(0);沒(méi)有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。- groups([default]):
以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)。default表示沒(méi)有截獲字符串的組以這個(gè)值替代,默認(rèn)為None。- groupdict([default]):
返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒(méi)有別名的組不包含在內(nèi)。default含義同上。- start([group]):
返回指定的組截獲的子串在string中的起始索引(子串第一個(gè)字符的索引)。group默認(rèn)值為0。- end([group]):
返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個(gè)字符的索引+1)。group默認(rèn)值為0。- span([group]):
返回(start(group), end(group))。- expand(template):
將匹配到的分組代入template中然后返回。template中可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號(hào)0。\id與\g<id>是等價(jià)的;但\10將被認(rèn)為是第10個(gè)分組,如果你想表達(dá)\1之后是字符'0',只能使用\g<1>0。
re的常用方法
- match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
從頭匹配pattern,若匹配不到,則返回None- search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
從字符串所有位置匹配pattern,若匹配不到,則返回None- split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])
按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數(shù),不指定將全部分割。- findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
搜索string,以列表形式返回全部能匹配的子串。- finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜索string,返回一個(gè)順序訪問(wèn)每一個(gè)匹配結(jié)果(Match對(duì)象)的迭代器。- sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])
使用repl替換string中每一個(gè)匹配的子串后返回替換后的字符串。
當(dāng)repl是一個(gè)字符串時(shí),可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號(hào)0。
當(dāng)repl是一個(gè)方法時(shí),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match對(duì)象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。
count用于指定最多替換次數(shù),不指定時(shí)全部替換。- subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
返回 (sub(repl, string[, count]), 替換次數(shù))。
參考了csnd博文,引用部分還沒(méi)有消化成自己的東西,在日常使用中,應(yīng)該用不到這么多的屬性和方法,以后再做刪減。先寫到這。。。
點(diǎn)到即止