個(gè)人主頁(yè):Lei寶啊?
愿所有美好如期而遇
概念:
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),正則匹配是一個(gè)模糊的匹配(不是精確匹配)
如下四個(gè)方法經(jīng)常使用:
- match()
- search()
- findall()
- finditer()
匹配單個(gè)字符或數(shù)字:?
匹配 | 說(shuō)明 |
---|---|
. | 匹配除換行符以外的任意字符,當(dāng)flags被設(shè)置為re.S時(shí),可以匹配包含換行符以內(nèi)的所有字符 |
[] | 里面是字符集合,匹配[]里任意一個(gè)字符 |
[0123456789] | 匹配任意一個(gè)數(shù)字字符 |
[0-9] | 匹配任意一個(gè)數(shù)字字符 |
[a-z] | 匹配任意一個(gè)小寫英文字母字符 |
[A-Z] | 匹配任意一個(gè)大寫英文字母字符 |
[A-Za-z] | 匹配任意一個(gè)英文字母字符 |
[A-Za-z0-9] | 匹配任意一個(gè)數(shù)字或英文字母字符 |
[^lucky] | []里的^稱為脫字符,表示非,匹配不在[]內(nèi)的任意一個(gè)字符 |
^[lucky] | 以[]中內(nèi)的某一個(gè)字符作為開(kāi)頭 |
\d | 匹配任意一個(gè)數(shù)字字符,相當(dāng)于[0-9] |
\D | 匹配任意一個(gè)非數(shù)字字符,相當(dāng)于[^0-9]
|
\w | 匹配字母、下劃線、數(shù)字中的任意一個(gè)字符,相當(dāng)于[0-9A-Za-z_] |
\W | 匹配非字母、下劃線、數(shù)字中的任意一個(gè)字符,相當(dāng)于[^0-9A-Za-z_]
|
\s | 匹配空白符(空格、換頁(yè)、換行、回車、制表),相當(dāng)于[ \f\n\r\t] |
\S | 匹配非空白符(空格、換頁(yè)、換行、回車、制表),相當(dāng)于[^ \f\n\r\t]
|
匹配錨字符
錨字符:用來(lái)判定是否按照規(guī)定開(kāi)始或者結(jié)尾
匹配 | 說(shuō)明 |
---|---|
^ | 行首匹配,和[]里的^不是一個(gè)意思 |
$ | 行尾匹配 |
\A | 匹配字符串的開(kāi)始,和^的區(qū)別是\A只匹配整個(gè)字符串的開(kāi)頭,即使在re.M模式下也不會(huì)匹配其他行的行首 |
\Z | 匹配字符串的結(jié)尾,和$的區(qū)別是\Z只匹配整個(gè)字符串的結(jié)尾,即使在re.M模式下也不會(huì)匹配其他行的行尾 |
限定符
限定符用來(lái)指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。
有 *? 或?+?或???或?{n}?或?{n,}?或?{n,m}?共6種。
匹配 | 說(shuō)明 |
---|---|
(xyz) | 匹配括號(hào)內(nèi)的xyz,作為一個(gè)整體去匹配 一個(gè)單元 子存儲(chǔ) |
x? | 匹配0個(gè)或者1個(gè)x,非貪婪匹配 |
x* | 匹配0個(gè)或任意多個(gè)x |
x+ | 匹配至少一個(gè)x |
x{n} | 確定匹配n個(gè)x,n是非負(fù)數(shù) |
x{n,} | 至少匹配n個(gè)x |
x{n,m} | 匹配至少n個(gè)最多m個(gè)x |
x|y | |表示或的意思,匹配x或y |
re模塊中常用函數(shù)
通用flags(修正符)
值 | 說(shuō)明 |
---|---|
re.I | 是匹配對(duì)大小寫不敏感 |
re.M | 多行匹配,影響到^和$ |
re.S | 使.匹配包括換行符在內(nèi)的所有字符 |
通用函數(shù)
-
獲取匹配結(jié)果
-
使用group()方法 獲取到匹配的值
-
groups() 返回一個(gè)包含所有小組字符串的元組(也就是自存儲(chǔ)的值),從 1 到 所含的小組號(hào)。?
-
match()函數(shù)
-
原型
def match(pattern, string, flags=0)
-
功能
匹配成功返回 匹配的對(duì)象
匹配失敗 返回 None
-
獲取匹配結(jié)果
-
使用group()方法 獲取到匹配的值
-
groups() 返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。
-
-
注意:從第一位開(kāi)始匹配 只匹配一次
-
參數(shù)
參數(shù) 說(shuō)明 pattern 匹配的正則表達(dá)式(一種字符串的模式) string 要匹配的字符串 flags 標(biāo)識(shí)位,用于控制正則表達(dá)式的匹配方式
舉例說(shuō)明:
import re
str1 = '124jfda\n'
str2 = '\n124jfda'
print(re.match(".",str1))
print(re.match(".",str2))
print(re.match(".",str2,re.S))
search()函數(shù)
-
原型
def search(pattern, string, flags=0)
-
功能
掃描整個(gè)字符串string,并返回第一個(gè)pattern模式成功的匹配
匹配失敗 返回 None
-
參數(shù)
參數(shù) 說(shuō)明 pattern 匹配的正則表達(dá)式(一種字符串的模式) string 要匹配的字符串 flags 標(biāo)識(shí)位,用于控制正則表達(dá)式的匹配方式 -
注意:
只要字符串包含就可以
只匹配一次
-
示例
str1 = '124jfda\n' str2 = '\n124jfda' print(re.search(".",str1)) print(re.search(".",str2)) print(re.search(".",str2,re.S))
-
注意
與search的區(qū)別
相同點(diǎn):
都只匹配一次
不同點(diǎn):
- search是在要匹配的字符串中 包含正則表達(dá)式的內(nèi)容就可以
- match 必須第一位就開(kāi)始匹配 否則匹配失敗
findall()函數(shù)(返回列表)
-
原型
def findall(pattern, string, flags=0)
-
功能
掃描整個(gè)字符串string,并返回所有匹配的pattern模式結(jié)果的字符串列表
-
參數(shù)
參數(shù) 說(shuō)明 pattern 匹配的正則表達(dá)式(一種字符串的模式) string 要匹配的字符串 flags 標(biāo)識(shí)位,用于控制正則表達(dá)式的匹配方式
?舉例:
import re
str = '13678324489'
print(re.findall("[14]",str))
print(re.findall("1[0-9]",str))
print(re.findall("1[0-9]{10}$",str))
print(re.findall("1[0-9]{9}$",str))
貪婪與非貪婪模式
貪婪:? ? ? ?.*
非貪婪:? ?.*?
str = "<b>加粗</b><b>加粗的</b><b>加粗的的</b>"
val1 = re.search('<b>.*</b>',str) #貪婪
val2 = re.search('<b>.*?</b>',str) #非貪婪
print(val1.group())
print(val2.group())
myStr = """
<a >百度</a>
<A >淘寶</A>
<a >電
影網(wǎng)站</a>
<i>我是傾斜1</i>
<i>我是傾斜2</i>
<em>我是傾斜2</em>
"""
#提取網(wǎng)址和名字
lt = re.findall('<a href="(.*?)">(.*?)</a>',myStr,re.S|re.I)
print(lt)
finditer()函數(shù)
-
原型
def finditer(pattern, string, flags=0)
-
功能
與findall()類似,返回一個(gè)迭代器
-
參數(shù)
參數(shù) 說(shuō)明 pattern 匹配的正則表達(dá)式(一種字符串的模式) string 要匹配的字符串 flags 標(biāo)識(shí)位,用于控制正則表達(dá)式的匹配方式
?舉例:
import re
ret = re.finditer('\d', '12456789')
print(ret)
print(next(ret))
for i in ret:
print(i)
split()函數(shù)(返回值為列表)
-
作用:切割字符串
-
原型:
def split(patter, string, maxsplit=0, flags=0)
-
參數(shù)
pattern 正則表達(dá)式
string 要拆分的字符串
maxsplit 最大拆分次數(shù) 默認(rèn)拆分全部
flags 修正符
示例:
import re
myStr = "asdas\rd&a\ts12d\n*a3sd@a_1sd"
#通過(guò)特殊字符 對(duì)其進(jìn)行拆分 成列表
#非字母拆分
res = re.split("[^a-z]",myStr)
print(res)
res = re.split("\W",myStr)
print(res)
正則高級(jí)
分組&起名稱
-
概念
處理簡(jiǎn)單的判斷是否匹配之外,正則表達(dá)式還有提取子串的功能,用()表示的就是要提取的分組
-
說(shuō)明
- 正則表達(dá)式中定義了組,就可以在Match對(duì)象上用group()方法提取出子串來(lái)
- group(0)永遠(yuǎn)是原始字符串,group(1)、group(2)……表示第1、2、……個(gè)子串
示例:
import re
s = '3G4HFD567'
#格式:?P<別名> ()里內(nèi)容表示要提取的分組
x = re.match("(?P<value>\d+)",s)
print(x.group(0))
print(x.group('value'))
編譯
-
概念
當(dāng)在python中使用正則表達(dá)式時(shí),re模塊會(huì)做兩件事,一件是編譯正則表達(dá)式,如果表達(dá)式的字符串本身不合法,會(huì)報(bào)錯(cuò)。另一件是用編譯好的正則表達(dá)式提取匹配字符串
-
編譯優(yōu)點(diǎn)
如果一個(gè)正則表達(dá)式要使用幾千遍,每一次都會(huì)編譯,出于效率的考慮進(jìn)行正則表達(dá)式的編譯,就不需要每次都編譯了,節(jié)省了編譯的時(shí)間,從而提升效率
-
compile()函數(shù)
-
原型
def compile(pattern, flags=0)
-
作用
將pattern模式編譯成正則對(duì)象
-
參數(shù)
參數(shù) 說(shuō)明 pattern 匹配的正則表達(dá)式(一種字符串的模式) flags 標(biāo)識(shí)位,用于控制正則表達(dá)式的匹配方式 -
flags
值 說(shuō)明 re.I 是匹配對(duì)大小寫不敏感 re.M 多行匹配,影響到^和$ re.S 使.匹配包括換行符在內(nèi)的所有字符 -
返回值
編譯好的正則對(duì)象
-
示例:
import re
str = '123456'
pattern = re.compile("\d")
print(pattern.search(str))
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-828651.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-828651.html
到了這里,關(guān)于爬蟲(chóng)之正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!