摘要:正則表達(dá)式簡(jiǎn)介正則表達(dá)式英語(yǔ),在代碼中常簡(jiǎn)寫為或,又稱正規(guī)表示式正規(guī)表示法正規(guī)表達(dá)式規(guī)則表達(dá)式常規(guī)表示法,是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。
正則表達(dá)式 簡(jiǎn)介
正則表達(dá)式(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法,是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些匹配某個(gè)模式的文本。
正則表達(dá)式規(guī)則,單字符匹配字符 | 功能 | 正則表達(dá)式示例 | 符合匹配示例 |
---|---|---|---|
. | 匹配任意一個(gè)字符(除了n) | b.b | bab,b2b |
[ ] | 匹配來自[]中字符集的任意一個(gè)字符 | i [abCde]m | i am |
d | 匹配任何十進(jìn)制數(shù)字,與[0-9]一致 | wdcschool | w3cschool |
D | 匹配非數(shù)字,即不是數(shù)字 | mouDh | mouth |
s | 匹配任何空格字符,與[ vf]相同 | islike | i like |
S | 匹配任何非空白字符,與s相反 | nSe | noe,n3e |
w | 匹配任何字母數(shù)字字符,與[A-Za-z0-9_]相同 | [A-Za-z]w+ | |
W | 匹配非單詞字符 | [0-9]W[A-Z] | 3 A |
字符 | 功能 | 正則表達(dá)式示例 | 符合匹配的示例 | |
---|---|---|---|---|
* | 匹配0次或者多次前面出現(xiàn)的正則表達(dá)式,即可有可無 | a* | aaa | |
+ | 匹配前一個(gè)字符出現(xiàn)1次或者無限次,即至少有一次 | a+ | aaa | |
? | 匹配前一個(gè)字符出現(xiàn)1次或者0次,要么有一次,要么沒有 | a? | a或者b | |
{m} | 匹配前一個(gè)字符出現(xiàn)m次 | [0-9]{5} | 12345 | |
{m.} | 匹配前一個(gè)字符至少出現(xiàn)m次 | a{5.} | aaaaa | |
{m,n} | 匹配前一個(gè)字符出現(xiàn)從m到n次 | a{2,6} | aaa |
字符 | 功能 | 正則表達(dá)式示例 |
---|---|---|
^ | 匹配字符串起始部分 | ^Dear |
$ | 匹配字符串終止部分 | fi$ |
b | 匹配任何單詞的邊界 | The |
B | 匹配非單詞邊界 | .*Bver |
字符 | 功能 | |
---|---|---|
匹配左右任意一個(gè)表達(dá)式 | ||
(ab) | 將括號(hào)中字符作為一個(gè)分組 | |
um | 引用分組num匹配到的字符串 | |
(?P |
分組起別名 | |
(?P=name) | 引用別名為name分組匹配到的字符串 |
在python中,可以使用內(nèi)置的re模塊來使用正則表達(dá)式
re模塊常見的函數(shù)和方法核心函數(shù) | 說明 |
---|---|
compile(pattern,flags=0) | 使用任何可選的標(biāo)記來編譯正則表達(dá)式的模式,然后返回一個(gè)正則表達(dá)式對(duì)象 |
re模塊函數(shù)和正則表達(dá)式對(duì)象方法 | 說明 |
---|---|
match(pattern,string,flags=0) | 嘗試使用帶有可選的標(biāo)記的正則表達(dá)式的模式來匹配字符串。如果匹配成功,就返回匹配對(duì)象; 如果失敗,就返回 None |
search(pattern,string,flags=0) | 使用可選標(biāo)記搜索字符串中第一次出現(xiàn)的正則表達(dá)式模式。 如果匹配成功,則返回匹配對(duì)象; 如果失敗,則返回 None |
findall(pattern,string[,flags]) | 查找字符串中所有出現(xiàn)的正則表達(dá)式,并返回一個(gè)列表 |
finditer(pattern,string[,flags]) | 與findall相同,但返回的是一個(gè)迭代器而不是一個(gè)列表(不常用) |
split(pattern,string,max=0) | 根據(jù)正則表達(dá)式的模式分隔符,spilt函數(shù)將字符串分割為列表,然后返回成功匹配的列表,分割最多操作max次(默認(rèn)分割所有匹配成功的位置) |
sub(pattern,repl,string,count=0) | 使用repl替換所有正則表達(dá)式的模式在字符串中出現(xiàn)的位置,除非定義count,否則就將替換所有出現(xiàn)的位置 |
常用的匹配對(duì)象方法 | 說明 |
---|---|
group(num=0) | 默認(rèn)返回整個(gè)匹配對(duì)象或者返回編號(hào)為num的特定子組 |
groups(default=None) | 返回一個(gè)包含所有匹配子組的元組,如果沒有成功匹配,返回一個(gè)空元組 |
span() |
常用的模塊屬性,大多數(shù)用于對(duì)正則表達(dá)式函數(shù)的修飾 | 說明 |
---|---|
re.I | 使匹配對(duì)大小寫不敏感(忽略大小寫) |
re.S | .(點(diǎn)號(hào))匹配除了n之外的所有字符,re.S標(biāo)記表示.(點(diǎn)號(hào))能夠匹配全部字符 |
re.M | 多行匹配,影響^和$ |
re.U | 根據(jù)Unicode字符集解析字符。影響w,W,和B |
re.X | 該標(biāo)志通過給予你更靈活的格式以便你講正則表達(dá)式寫得更易于理解 |
使用 compile() 函數(shù)將正則表達(dá)式的字符串形式編譯為一個(gè)正則表達(dá)式對(duì)象;
通過正則表達(dá)式對(duì)象提供的一系列方法(如:match())對(duì)文本進(jìn)行匹配查找,獲得匹配結(jié)果,一個(gè)Match對(duì)象;
最后使用Match對(duì)象提供的屬性和方法(例如:group())獲得信息,根據(jù)需要進(jìn)行其他的操作。
re模塊使用示例導(dǎo)入模塊
import re
compile()函數(shù)
compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè) Pattern 對(duì)象,它的一般使用形式如下:
import re # 將正則表達(dá)式編譯成pattern對(duì)象 pattern = re.compile(r"d+")
編譯成正則表達(dá)式對(duì)象后,就可以使用上面所說的正則表達(dá)式對(duì)象方法了。
match()方法
match 方法用于查找字符串的頭部(也可以指定起始位置),它是一次匹配,只要找到了一個(gè)匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果。它的一般使用形式如下:
match(string[, pos[, endpos]])
其中,string是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始和終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。因此,當(dāng)你不指定 pos 和 endpos 時(shí),match 方法默認(rèn)匹配字符串的頭部。
當(dāng)匹配成功時(shí),返回一個(gè) Match 對(duì)象,如果沒有匹配上,則返回 None。
>>> import re >>> >>> pattern = re.compile(r"d+") # 正則表達(dá)式表示匹配至少一個(gè)數(shù)字 >>> >>> m = pattern.match("one2three4") # match默認(rèn)從開頭開始匹配,開頭是字母o,所以沒有匹配成功 >>> print(m) # 匹配失敗返回None None >>> >>> m = pattern.match("1two3four") # 開頭字符是數(shù)字,匹配成功 >>> print(m) <_sre.SRE_Match object; span=(0, 1), match="1"> >>> >>> m.group() # group()方法獲取匹配成功的字符 "1" >>> m = pattern.match("onetwo3four56",6,12) # 指定match從數(shù)字3開始查找,第一個(gè)是數(shù)字3,匹配成功 >>> print(m) <_sre.SRE_Match object; span=(6, 7), match="3"> >>> m.group() "3"
search()方法
search 方法用于查找字符串的任何位置,從任何位置開始往后查找,它也是一次匹配,只要找到了一個(gè)匹配的結(jié)果就返回,而不是查找所有匹配的結(jié)果,它的一般使用形式如下:
search(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始和終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。
當(dāng)匹配成功時(shí),返回一個(gè) Match 對(duì)象,如果沒有匹配上,則返回 None。
In [1]: import re In [2]: pattern = re.compile(r"[A-Za-z]+") # 表示匹配至少一個(gè)字母 In [3]: ret = pattern.search("123four5") # 這里如果使用match則不匹配,因?yàn)橐詳?shù)字開頭 In [4]: print(ret) <_sre.SRE_Match object; span=(3, 7), match="four"> In [5]: ret.group() Out[5]: "four" In [9]: ret = pattern.search("123four5six789",7,12) In [10]: print(ret) <_sre.SRE_Match object; span=(8, 11), match="six"> In [11]: ret.group() Out[11]: "six" In [12]: ret = pattern.search("123four5six789",1,2) In [13]: print(ret) # 不匹配,返回None None
findall()方法
match方法和search方法都是匹配到正則表達(dá)式的第一個(gè)內(nèi)容,如果想要獲取正則表達(dá)式匹配的所有內(nèi)容,就可以使用findall方法了。這個(gè)方法會(huì)搜索整個(gè)字符串,然后返回匹配正則表達(dá)式的所有內(nèi)容。
findall 方法的使用形式如下:
findall(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可選參數(shù),指定字符串的起始和終點(diǎn)位置,默認(rèn)值分別是 0 和 len (字符串長(zhǎng)度)。
findall 以列表形式返回全部能匹配的子串,如果沒有匹配,則返回一個(gè)空列表。
示例:
import re pattern = re.compile(r"d+") ret1 = pattern.findall("hello 123 world 456")# 匹配123,456 ret2 = pattern.findall("one1two2three3") # 匹配1,2,3 ret3 = pattern.findall("hello world") # 沒有數(shù)字不匹配,返回空列表 print(ret1) print(ret2) print(ret3)
運(yùn)行結(jié)果:
["123", "456"] ["1", "2", "3"] []
spilt()方法
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
split(string[, maxsplit])
其中,maxsplit 用于指定最大分割次數(shù),不指定將全部分割。
示例:
>>> import re >>> >>> pattern = re.compile(r"[s;,]+") >>> ret = pattern.split("hello world;;ha,ha") >>> print(ret) ["hello", "world", "ha", "ha"]
sub()方法
sub 方法用于替換,在python爬蟲中常用語(yǔ)修改文本。比如把一串文本中所有數(shù)字去掉,把數(shù)字去掉可以使用字符串方法中的replace方法,但是太麻煩了,使用sub()方法就可以很方便去掉。sub()方法的使用形式如下:
sub(repl, string[, count])
其中,repl 可以是字符串也可以是一個(gè)函數(shù):
如果 repl 是字符串,則會(huì)使用 repl 去替換字符串每一個(gè)匹配的子串,并返回替換后的字符串,另外,repl 還可以使用 id 的形式來引用分組,但不能使用編號(hào) 0;
如果 repl 是函數(shù),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match 對(duì)象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。
count 用于指定最多替換次數(shù),不指定時(shí)全部替換。
示例:
import re content = "42hjad24ta d25a14aad" content = re.sub("d+","",content) print(content)
運(yùn)行結(jié)果:
hjadta daaad正則表達(dá)式規(guī)則常見使用 貪婪匹配和非貪婪匹配
貪婪模式:在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配 ( * );
非貪婪模式:在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配 ( ? );
Python中默認(rèn)是貪婪模式
示例
源字符串:abccc
貪婪模式匹配:abc*
非貪婪模式匹配:abc*?
abc*,匹配盡可能多個(gè)c
abc*?,匹配盡可能少個(gè)c,最少為0即沒有,所以打印ab
>>> import re >>> >>> ret = re.match("abc*","abccc") >>> print(ret) <_sre.SRE_Match object; span=(0, 5), match="abccc"> >>> >>> ret.group() "abccc" >>> >>> ret = re.match("abc*?","abccc") >>> ret.group() "ab"分組
圓括號(hào)()匹配封閉的正則表達(dá)式,然后另存為子組。
>>> m = re.match("(www)@(ffffd).(www)","[email protected]") >>> m.group() "[email protected]" >>> m.group(1) "xxx" >>> m.group(2) "163" >>> m.group(3) "com" >>> m.groups() ("xxx", "163", "com")
group()通常用于以普通方式顯示所有的匹配部分,但也可以用于獲取各個(gè)匹配的子組。而groups()方法可以獲取一個(gè)包含所有匹配子字符串的元組。
轉(zhuǎn)義匹配當(dāng)匹配目標(biāo)中有正則表達(dá)式的特殊字符,就需要使用轉(zhuǎn)義字符""將特殊字符的作用屏蔽掉。
>>> content = "(hello,world)" >>> m = re.match("(.*)",content) >>> print(m) <_sre.SRE_Match object; span=(0, 13), match="(hello,world)"> >>> m.group() "(hello,world)"通用匹配
.(點(diǎn)號(hào))表示匹配任意一個(gè)字符,*(星號(hào))表示匹配前面的字符無限次,組合起來.*就是匹配任意字符。
>>> content = "hello 123456789 world hahaha" >>> m = re.match("^hello.*ha$",content) >>> print(m) <_sre.SRE_Match object; span=(0, 28), match="hello 123456789 world hahaha"> >>> m.group() "hello 123456789 world hahaha"匹配多個(gè)字符串
豎線"|"表示匹配豎線左邊的表達(dá)式或者右邊的表達(dá)式,如re1|re2,滿足其中一個(gè)表達(dá)式就匹配成功
>>> m = re.match("abc|adc|aec","adc") >>> m.group() "adc" >>> m = re.match("abc|adc|aec","aoc") >>> print(m) None >>> m = re.findall("abc|adc|aec","abc aec aoc") >>> print(m) ["abc", "aec"][]字符集使用
方括號(hào)[]表示匹配來自字符集中任意一個(gè)字符。
>>> m = re.match("[abc][123][A-Z]","b2A") >>> m.group() "b2A" >>> m = re.match("[abc][123][A-Z]","a3A") >>> m.group() "a3A" >>> m = re.match("[abc][123][A-Z]","d2B") # 不匹配 >>> print(m) None >>>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43229.html
摘要:正則表達(dá)式關(guān)閉或可選標(biāo)志。如果所含正則表達(dá)式,以表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。否則指的是八進(jìn)制字符碼的表達(dá)式。 正則表達(dá)式是個(gè)很牛逼的東西,不管是在javascript,還是在Python web開發(fā)(http://www.maiziedu.com/course/python-px...)中,我們都會(huì)遇到正則表達(dá)式,雖然javascript和Python的正則表達(dá)式區(qū)別不大...
摘要:多行模式,改變?cè)址偷男袨?。模塊級(jí)方法編譯正則表達(dá)式,返回一個(gè)對(duì)象。掃描參數(shù),查找正則表達(dá)式產(chǎn)生匹配的第一個(gè)結(jié)果,返回一個(gè)對(duì)象。清空正則表達(dá)式緩存。和參數(shù)意義同與模塊級(jí)的相同與模塊級(jí)的相同屬性返回一個(gè)正整數(shù),表示正則匹配模式。 匹配模式 re.ASCII同re.A,對(duì)應(yīng)的內(nèi)聯(lián)標(biāo)識(shí)為(?a),用于向后兼容。使元字符w, W, , B, d, D, s和S僅匹配ASCII字符。該模式只...
摘要:正則表達(dá)式語(yǔ)法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義字符類包含在中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指定量詞則只會(huì)匹配其中的一個(gè)。 1. 正則表達(dá)式語(yǔ)法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指...
摘要:正則表達(dá)式匹配的字符串限定范圍和否定除了單字符外,字符集還支持匹配指定的字符范圍。問號(hào)要求正則表達(dá)式引擎在當(dāng)前正則表達(dá)式中盡可能少地匹配字符。正則表達(dá)式匹配的字符串表示簡(jiǎn)單浮點(diǎn)數(shù)的字符串?dāng)U展表示法正則表達(dá)式的擴(kuò)展表示法,以問號(hào)開始。 簡(jiǎn)介 正則表達(dá)式 是包含文本和特殊字符的字符串, 為高級(jí)的文本模式匹配, 抽取, 與文本形式的搜索和替換功能提供了基礎(chǔ) Python通過標(biāo)準(zhǔn)庫(kù)re模...
摘要:反斜杠的困擾與大多數(shù)編程語(yǔ)言相同,正則表達(dá)式里使用作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。文本中正則表達(dá)式結(jié)束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數(shù),不指定將全部分割。 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡(jiǎn)單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語(yǔ)法以及一個(gè)獨(dú)立的處理引擎,效率上可能不如str自帶的方法...
閱讀 3755·2021-11-22 13:52
閱讀 3628·2019-12-27 12:20
閱讀 2401·2019-08-30 15:55
閱讀 2154·2019-08-30 15:44
閱讀 2273·2019-08-30 13:16
閱讀 586·2019-08-28 18:19
閱讀 1893·2019-08-26 11:58
閱讀 3447·2019-08-26 11:47