正則表達式,用于在一大堆數(shù)據(jù)中查找信息,學(xué)習(xí)后有利于爬蟲信息抓取。
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。10多年品質(zhì),值得信賴!
“. ^ $ * + ? { } [ ] \ | ( )”是元字符(關(guān)鍵字),如要匹配原字符則需加“\”,如“\[”“\\”。為避免與轉(zhuǎn)義符(\n、\b)沖突,可在字符串前加r,即 r"" 或 r'' 。
字符:
“\d”表示數(shù)字
“\D”表示非數(shù)字的字符
“\s”表示空白字符,相當(dāng)于[ \t\n\r\f\v]
“\S”相當(dāng)于[^ \t\n\r\f\v]
“\w”表示數(shù)字或字母
“\W”表示非數(shù)字和字母的字符
“.”表示除換行符'\n'外的所有字符,DOTALL模式下可匹配任何字符(包括'\n')
“[]”整體為一個字符,其中的內(nèi)容表示"或者"關(guān)系,同時元字符全部失效。如:[12]表示'1'或'2',[a-z]表示小寫字母(包括擴展拉丁字母如 'é'),[A-Za-z]表示所有字母,而[^a]表示除'a'以外的所有字符,[a^]表示'a'或'^'。由于元字符失效,從而可以 '[\n]' 的方式表示回車符等轉(zhuǎn)義符,但復(fù)雜情況下仍推薦使用 r""。
以下字符都不代表實際字符,即所謂零寬度,稱為斷言:
“^”指示行的開頭,不代表實際字符,如MULTILINE模式下以“^a”去匹配“b\nab”則span=(2, 3)。若不是MULTILINE,則僅指示字符串開頭。
“$”指示行的末尾。同樣需要MULTILINE
“\A”指示字符串的開頭
“\Z”指示字符串的末尾
“\b”指示詞邊界,即每個單詞的開頭和結(jié)尾,單詞結(jié)構(gòu)中可包括數(shù)字和字母,其他字符如空格逗號可以將其分割為一個個單詞。可以指示字符串開頭??赡芘c退格符'\b'沖突,加r或使用'\\b'。
“|”表示或者,優(yōu)先級比普通字符還低,如“phone|tele”表示"phone"或"tele"
而“()”可控制“|”的范圍,如“the (phone|tele)”
重復(fù):
“*”表示前一個字符重復(fù)0~+inf次
“+”表示前一個字符重復(fù)1~+inf次
“?”表示前一個字符重復(fù)0或1次,可有可無
“{m}”表示前一個字符重復(fù)m次
“{a,b}”表示前一個字符重復(fù)a~b次,同時“{,b}”表示0~b,“{a,}”表示a~+inf次。注意大括號中不可包含空格,如“{a, b}”是錯誤的,應(yīng)為“{a,b}”。
以上符號默認(rèn)均為貪婪模式,即匹配盡可能多的字符。如果需匹配盡可能少的字符,可在其后加上“?”符號,如“a*?”為非貪婪模式。
“()”可使重復(fù)符號作用于其括住的全部字符上,如“(br)*”指'br'重復(fù)0~+inf次
【re模塊】
基本方法:
“p = re.compile(r'ab*')”編譯一個匹配器(正則),r'ab*'為匹配規(guī)則的表達式(模式)
“m = p.match('abbcabd')”在'abbcabd'中從第一個字符開始匹配,結(jié)果保存在match對象中并返回
“m = p.search('abbcabd')”在'abbcabd'中不斷向后查找,只返回第一個最先匹配到的內(nèi)容
“l(fā)istAll = p.findall('abbcabd')”在'abbcabd'中不斷向后查找所有能匹配的內(nèi)容,并將其以列表的方式返回
“iterAll = p.finditer('abbcabd')”上一種方式的迭代器版本,迭代時才查找并返回內(nèi)容
“s = m.group()”或“s = m.group(0)”獲得匹配的內(nèi)容
“s = m.start()”獲得匹配內(nèi)容在字符串中的起始索引值,指向匹配內(nèi)容的第一個字符
“s = m.end()”獲得匹配內(nèi)容在字符串中的終止索引值,指向匹配內(nèi)容最后一個字符的后一個字符
“s = m.span()”獲得匹配內(nèi)容在字符串中的范圍,元組方式返回,范圍為左包含而右不包含的
“print(m)”輸出匹配的范圍和內(nèi)容
分組:
在正則表達式中把需要的信息用小括號“()”括起來,即可獲得它們,稱為分組。如:
“p = re.compile(r'\w(\w)(\w+)')”
“m = p.match('This is Python')”
之后“m.group(1)”可返回第一個分組的內(nèi)容,即'h'
“m.group(2)”可返回第二個分組的內(nèi)容,即'is'
以此類推
而“m.group()”或“m.group(0)”依然返回匹配到的所有內(nèi)容,即 'This'
“m.groups()”可將所有分組內(nèi)容以元組的方式返回,即('h', 'is')
分組編號從左到右,由內(nèi)而外。如以r'\w((\w)\w+)'匹配'This is Python'則第一個分組內(nèi)容為 'his',第二個為 'h',groups()得 ('his', 'h')。
“\1”可指代前面第一個分組匹配到的內(nèi)容,表示“\1”這里必須要再次出現(xiàn)此內(nèi)容,可用于檢測雙字(疊詞)。如:
p = re.compile(r'\b(\w+)\s+\1\b') print(p.search('Paris in the the spring').group())