新聞中心
由于最近需要使用爬蟲爬取數(shù)據(jù)進行測試,所以開始了爬蟲的填坑之旅,那么首先就是先系統(tǒng)的學習下關(guān)于正則相關(guān)的知識啦。所以將下面正則方面的知識點做了個整理。語言環(huán)境為Python。主要講解下Python的Re模塊。

成都創(chuàng)新互聯(lián)服務(wù)項目包括濰坊網(wǎng)站建設(shè)、濰坊網(wǎng)站制作、濰坊網(wǎng)頁制作以及濰坊網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,濰坊網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到濰坊省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
下面的語法我就主要列出一部分,剩下的在python官網(wǎng)直接查閱即可: docs.python.org/3/library/r…
一、基礎(chǔ)語法總結(jié)
1.1、匹配單個字符
a . d D w W s S [...] [^...]
匹配單個字符(.)
規(guī)則:匹配除換行之外的任意字符
- In [24]: re.findall("f.o","foo is not fao")
- Out[24]: ['foo', 'fao']
匹配任意(非)數(shù)字字符(d D)
- d [0-9]
- D [^0-9]
匹配任意(非)普通字符(w W)
w 普通字符 包括[_0-9A-Za-z]同時也包括漢字
W 非普通字符
匹配任意(非)空字符(s S)
s 匹配任意空字符 [ ]
S 匹配任意非空字符
匹配字符集合([...])
[A-Z][a-z][0-9][_123a-z]
匹配字符集([^...])
規(guī)則:字符集取非,除列出的字符之外的任意一個字符
[^abc] --> 除a b c之外任意字符
1.2、匹配多個字符
* 匹配0次或者多次
+ 匹配1次或者多次
? 匹配0次或者1次
{m} 匹配m次
{m,n} 匹配m次到n次區(qū)間內(nèi)的任意一次
1.3、匹配位置
^ 匹配開始位置
$ 匹配結(jié)束位置
A 匹配開始位置
Z 匹配結(jié)束位置
匹配單詞邊界位置(一般用于首字母大寫的匹配)
B 匹配非單詞邊界問題
1.4、轉(zhuǎn)義
在正則表達式中有一類特殊字符需要轉(zhuǎn)移,只需要在特殊字符之間加上 表示轉(zhuǎn)移即可
. * + ? ^ $ [] {} () |
1.5、子組
使用() 可以為正則表達式建立內(nèi)部分組,子組為正則表達式的一部分,可以看做一個內(nèi)部整體。
- In [61]: re.search(r"(https|http|ftp)://w+.w+.(com|cn)","https://www.baidu.com").group(0)
- Out[61]: 'https://www.baidu.com'
- In [62]: re.search(r"(https|http|ftp)://w+.w+.(com|cn)","https://www.baidu.com").group(1)
- Out[62]: 'https'
1.6、貪婪模式和非貪婪模式
正則表達式的重復匹配總是盡可能多的向后匹配更多的內(nèi)容。 貪婪模式包括:* + ? {m,n}
非貪婪模式:盡可能少的匹配內(nèi)容 貪婪模式轉(zhuǎn)換為非貪婪模式:*? +? ?? {m,n}?
- In [106]: re.findall(r"ab+?","abbbbbbbb")
- Out[106]: ['ab']
- In [107]: re.findall(r"ab??","abbbbbbbb")
- Out[107]: ['a']
二、Re模塊
接下來我所有函數(shù)里面的參數(shù)解釋如下:
- pattern:正則表達式
- string:目標字符串
- pos:截取目標字符串起始位置
- endpose:截取目標字符串結(jié)束位置
- flags:功能標志
- replaceStr:替換的字符串
- max:最多替換幾處(默認替換全部)
有上圖我們看出來,接下來我們要將的Python中re模塊、regex對象、match對象三者之間是存在一定關(guān)系的。
- re模塊的compile方法返回一個regex對象
- re模塊和regex對象的finditer()、fullmatch()、match()、search()等方法返回一個match對象
- 他們分別有自己的屬性和方法
2.1、compile
- regex = re.compile(pattern, flags = 0) # 生成正則表達式對象
2.2、findall
- re.findall(pattern,string,pos,endpose) # 從目標字符串中匹配所有符合條件的內(nèi)容
2.3、split
- re.split(pattern,string,flags) #根據(jù)正則表達式對目標字符串進行分割
- In [79]: re.split(r's+',"Hello World")
- Out[79]: ['Hello', 'World']
2.4、sub
- re.sub(pattern,replaceStr,string,max,flags)
- In [80]: re.sub(r's+',"##","hello world")
- Out[80]: 'hello##world'
2.5、subn
- re.subn(pattern,replaceStr,string,max,flags) #功能同sub,但是返回值返回替換后的字符串和替換了幾處
- In [80]: re.sub(r's+',"##","hello world")
- Out[80]: ('hello##world',1)
2.6、finditer
- re.finditer(pattern,string) #使用正則表達式匹配目標字符串,返回一個match對象,match對象調(diào)用group()之后才能拿到值
- In [87]: it = re.finditer(r'd+',"2014nianshiqiqngduo 08aoyun 512dizhen")
- In [88]: for i in it:
- ....: print(i)
- ....:
- <_sre.SRE_Match object at 0x7f0639767920>
- <_sre.SRE_Match object at 0x7f0639767ac0>
- <_sre.SRE_Match object at 0x7f0639767920>
- In [93]: it = re.finditer(r'd+',"2014nianshiqiqngduo 08aoyun 512dizhen")
- In [94]: for i in it:
- ....: print(i.group())
- ....:
- 2014
- 08
- 512
2.7、fullmatch
- fullmatch(pattern,string,flags) #完全匹配目標字符串,相當于加了^ 和 $
2.8、match
- re.match(pattern,string,flags) #匹配目標字符串開頭的位置
2.9、search
- re.search(pattern,string,flags) # 正則表達式匹配目標字符串,只匹配***處
三、一些練習題
3.1、匹配首字母大寫的單詞
- import re
- f = open('test.txt')
- pattern= r'[A-Z][a-zA-Z]*s*'
- # pattern= r'[A-Z]S'
- L = []
- for i in f:
- L += re.findall(pattern,i)
- print(L)
test.txt文檔內(nèi)容如下:
- Hello World -12.6
- Nihao 123
- How are you -12
- 1.24
- asdk 34%,
- 占比 1/2
- 2003 - 2005./%
3.2、匹配數(shù)字(正數(shù)、負數(shù)、小數(shù)、百分數(shù)、分數(shù))
- import re
- pattern = "-?d+((/?d+)|((.)?d+)|((%)?))"
- f = open('test.txt')
- l = []
- for line in f:
- l += re.finditer(pattern,line)
- for i in l:
- print(i.group())
新聞名稱:感謝師哥!一個正則表達式居然可以給我分享的這么詳細!
文章分享:http://www.5511xx.com/article/dhscsig.html


咨詢
建站咨詢
