Python 中使用re模塊處理正則表達(dá)式,正則表達(dá)式主要用來(lái)處理文本中的查找,匹配,替換,分割等問(wèn)題;我們先來(lái)看一個(gè)問(wèn)題,切入正則表達(dá)式。

匹配字符串,最少以3個(gè)數(shù)字開(kāi)頭。使用Python代碼如何實(shí)現(xiàn)?
檢查條件:
1>字符串長(zhǎng)度判斷;
2>判斷前三個(gè)字符是否是數(shù)字;
這樣實(shí)現(xiàn)起來(lái)有點(diǎn)啰嗦,我們可以使用正則表達(dá)式,先來(lái)看正則表達(dá)式基本語(yǔ)法。
. 匹配任意字符(不包括換行符)
^ 匹配開(kāi)始位置,多行模式下匹配每一行的開(kāi)始
$ 匹配結(jié)束位置,多行模式下匹配每一行的結(jié)束
* 匹配前一個(gè)元字符0到多次
+ 匹配前一個(gè)元字符1到多次
? 匹配前一個(gè)元字符0到1次
{m,n} 匹配前一個(gè)元字符m到n次
\ 轉(zhuǎn)義字符,例如\.只能匹配.
[] 字符集,一個(gè)字符的集合,可匹配其中任意一個(gè)字符
\d 匹配一個(gè)數(shù)字, 相當(dāng)于 [0-9]
\D 匹配非數(shù)字,相當(dāng)于 [^0-9]
\s 匹配任意空白字符, 相當(dāng)于 [ \t\n\r\f\v]
\S 匹配非空白字符,相當(dāng)于 [^ \t\n\r\f\v]
\w 匹配數(shù)字、字母、下劃線中任意一個(gè)字符, 相當(dāng)于 [a-zA-Z0-9_]
\W 匹配非數(shù)字、字母、下劃線中的任意字符,相當(dāng)于 [^a-zA-Z0-9_]
| 邏輯表達(dá)式 或 ,比如 a|b 代表可匹配 a 或者 b
(...) 分組給一坨這個(gè)玩意,怎么用,都需要記住嗎?
如果能記住就記住,如果很久不使用,就忘記吧;
等使用的時(shí)候直接查資料,理解能使用即可。
下面我們結(jié)合re模塊,看正則表達(dá)式如何使用。
Python中正則表達(dá)式執(zhí)行過(guò)程:根據(jù)表達(dá)式編譯生成Pattern對(duì)象,然后進(jìn)行相關(guān)處理;
如果高頻率使用一個(gè)固定的正則表達(dá)式,我們可以提前生成Pattern對(duì)象,提高效率。
compile方法:
import re
re.compile(pattern, flags=0) #pattern為正則表達(dá)式參數(shù):
pattern:正則表達(dá)式,是指為字符串;為了防止轉(zhuǎn)義推薦使用原字符串(r'xxx');
flags:編譯標(biāo)志位,修改正則表達(dá)式的匹配方式,例如:大小寫(xiě)區(qū)分,換行處理等;
例子:匹配任意一個(gè)數(shù)字開(kāi)頭字符串:
import re
pobj = re.compile(r'\d')
type(pobj)輸出結(jié)果:re.Pattern對(duì)象;
問(wèn)題:如何來(lái)匹配呢?
re.match方法:從起始位置開(kāi)始匹配,返回None或者re.Match對(duì)象;
#re模塊match方法,參數(shù):pattern:正則表達(dá)式,string:處理字符串
re.match(pattern, string, flags=0)
#re.Pattern對(duì)象中match方法,參數(shù):string:處理字符串
re.Pattern.match(string, pos=0, endpos=...)練習(xí):匹配一個(gè)數(shù)字開(kāi)頭字符串:
import re
ma = re.match(r'\d', '123')
print(ma)輸出結(jié)果:
<re.Match object; span=(0, 1), match='1'>match方法匹配過(guò)程:生成Pattern對(duì)象,然后進(jìn)行匹配;
如何獲取匹配結(jié)果?來(lái)看Match對(duì)象相關(guān)方法。
| 方法 | 說(shuō)明 | |
|---|---|---|
| ma.end(group=0, /) | 返回指定分組的結(jié)束位置 | |
| ma.start(group=0, /) | 返回指定分組的開(kāi)始位置 | |
| ma.span(group=0, /) | 返回指定分組開(kāi)始與結(jié)束位置 | |
| ma.group([group1, ...]) | 返回字符串或者元組 | |
| ma.groups(default=None) | 返回所有分組信息 | |
| groupdict([default=None]) | 根據(jù)key獲取分組信息 |
實(shí)際操作下,理解起來(lái)就容易了:
import re
import re
#正則表達(dá)式:匹配內(nèi)容:數(shù)字+a~z+數(shù)字,并且進(jìn)行分組
ma = re.match(r'(\d)\w*(\d)', '1c3')
#匹配結(jié)果:'1c3'
print('group():', ma.group())
#獲取指定分組:1
print('group(1):', ma.group(1))
#獲取多個(gè)分組:('1', '3')
print('group(1,2):', ma.group(1,2))
#獲取所有分組:('1', '3')
print('groups():', ma.groups())
#獲取匹配結(jié)果索引:(0, 3)
print('span():', ma.span())
#獲取指定分組索引:(0, 1)
print('span(1):',ma.span(1))輸出結(jié)果:
group(): 1c3
group(1): 1
group(1,2): ('1', '3')
groups(): ('1', '3')
span(): (0, 3)
span(1): (0, 1)match方法只能用于從頭匹配,如何在整個(gè)字符串中查找?
使用search方法。
search方法用于在字符串中查找,返回Match對(duì)象或者None;
search(pattern, string, flags=0);參數(shù)與match類(lèi)似。練習(xí):查找第一次出現(xiàn)的數(shù)字組成的字串,例如:
在字符串:'pay:2000 date:2019-03-04',找到支付價(jià)格:2000;
分析:
1>支付前固定值:'pay:'
2>支付金額:數(shù)字字符串
對(duì)應(yīng)正則表達(dá)式邏輯:'pay:'+匹配數(shù)字直到非數(shù)字字符;具體實(shí)現(xiàn):
s = 'pay:2000 date:2019-03-04'
#\d+:匹配數(shù)字一次或者多次
ma = re.search(r'pay:\d+', s)
print(ma)輸出結(jié)果:
<re.Match object; span=(0, 8), match='pay:2000'>如何獲取2000這個(gè)值?增加一個(gè)分組,代碼實(shí)現(xiàn):
s = 'pay:2000 date:2019-03-04'
#\d+:匹配數(shù)字一次或者多次,使用分組
ma = re.search(r'pay:(\d+)', s)
print(ma)
#獲取分組1對(duì)應(yīng)值
print(ma.group(1))輸出結(jié)果:
<re.Match object; span=(0, 8), match='pay:2000'>
2000re.findall:在字符串中根據(jù)正則表達(dá)式查找所有匹配,返回查找結(jié)果組成列表;
re.finditer與findall功能相同,返回自迭代器;
re.findall(pattern, string, flags=0)練習(xí):查找字符串中所有數(shù)字字符串,
例如:'pay:2000 date:2019-03-04' 查找數(shù)字結(jié)果:['2000', '2019', '03', '04']
實(shí)現(xiàn)如下:
import re
s = 'pay:2000 date:2019-03-04'
result = re.findall(r'\d+', s)
print(result)結(jié)果為列表:['2000', '2019', '03', '04'];
re.split:字符串中根據(jù)正則表達(dá)式查找匹配字符串,然后進(jìn)行切分,返回字串列表;
re.split(pattern, string, maxsplit=0, flags=0)
#maxsplit:切分次數(shù),默認(rèn)所有匹配都切分練習(xí):
info = 'system:linux, cpu:x64 memory 8G'
整理格式:
dinfo = {'system':'linux', 'cpu':'x64', 'memory':'8G'}分析:
1>對(duì)info使用非字母,數(shù)字進(jìn)行切分;
2>切分后將其整理成字典;
第一步切分:
info = 'system:linux, cpu:x64 memory 8G'
#正則表達(dá)式:\W+,匹配1個(gè)或多個(gè)
s = re.split(r'\W+',info)
print(s)切分結(jié)果:['system', 'linux', 'cpu', 'x64', 'memory', '8G'];
第二步整理字典:
info = 'system:linux, cpu:x64 memory 8G'
s = re.split(r'\W+',info)
dinfo = {}
for index in range(0, len(s), 2):
dinfo[s[index]] = s[index+1]
print(dinfo)輸出結(jié)果:{'system': 'linux', 'cpu': 'x64', 'memory': '8G'}
re.sub與re.subn實(shí)現(xiàn)的字符串替換功能;
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)re.sub方法根據(jù)正則表達(dá)式將匹配子串替換成設(shè)置值并返回新字符串;參數(shù)如下:
| 主要參數(shù) | 說(shuō)明 |
|---|---|
| pattern | 正則表達(dá)式 |
| repl | 替換內(nèi)容,可以是字符串或者函數(shù) |
| string | 處理字符串 |
| count | 替換數(shù)量 |
re.subn與re.sub類(lèi)似,返回替換數(shù)量與新字符串;
練習(xí):
s = "user:sun,pwd:222222",將密碼:222222 替換為:******;可以直接使用字符串替換方法:
s.replace('222222', '******')
#結(jié)果:'user:sun,pwd:******'如果密碼為不一樣數(shù)字如何替換?例如:
s = "user:sun,pwd:234567"使用re.sub方法:
#將pwd:xxxx替換成******
re.sub(r'pwd:(\d+)', "******", s)
#結(jié)果:'user:sun,******'問(wèn)題:pwd:去哪里了?如何處理?使用分組。
#pattern使用兩個(gè)分組
#repl為原字符串,\1代表第一個(gè)分組內(nèi)容,
re.sub(r'(pwd:)(\d+)', r"\1******", s)替換結(jié)果:
'user:sun,pwd:******'大家可以理解下這個(gè)題目。
新的問(wèn)題來(lái)了,一組考試成績(jī):
s = 'math:90, chinese:90, english:50'大于等于60,替換成Pass,否則替換成Faild;推薦使用正則。
我們可以使用函數(shù)功能,先來(lái)看匹配分?jǐn)?shù),將其替換為空字符串;
re.sub(r'\d+', '', s)結(jié)果:'math:, chinese:, english:';
我們將repl替換成函數(shù),函數(shù)有一個(gè)參數(shù),返回值為空字符串;
def func(arg):
print(arg)
return ''
re.sub(r'\d+', func, s)輸出結(jié)果:
<_sre.SRE_Match object; span=(5, 7), match='90'>
<_sre.SRE_Match object; span=(17, 19), match='90'>
<_sre.SRE_Match object; span=(29, 31), match='50'>
'math:, chinese:, english:'可以看到func中參數(shù)為每個(gè)匹配的match對(duì)象,我們可以獲取這個(gè)值,并對(duì)其處理。
def func(arg):
#獲取分?jǐn)?shù)
score = int(arg.group())
#重置返回結(jié)果
if score <60:
return 'Faild'
return 'Pass'
re.sub(r'\d+', func, s)輸出結(jié)果:
'math:Pass, chinese:Pass, english:Faild'match,split等方法中都有一個(gè)標(biāo)志位,主要設(shè)置值如下:
| flag值 | 說(shuō)明 |
|---|---|
| re.I/re.IGNORECASE | 匹配不區(qū)分大小寫(xiě) |
| re.L/re.LOCALE | \w, \W, \b, \B, \s and \S 依賴于本地 |
| re.M/re.MULTILINE | 多行匹配,對(duì)'^'與'$'有影響 |
| re.S/re.DOTALL | 使'.'特殊字符匹配任何字符 |
| re.U/re.UNICODE | 根據(jù)Unicode字符集解析字符。\w, \W, \b, \B, \d, \D, \s和 \S 取決于UNICODE定義的字符屬性 |
| re.X/re.VERBOSE | 此標(biāo)志允許您編寫(xiě)正則表達(dá)式,可添加注釋 |
這些標(biāo)志位可以結(jié)合使用,例如:re.M | re.S。
每個(gè)標(biāo)志使用案例與對(duì)比如下:
ma = re.match(r'name:\w+', 'Name:sun age:10')
print(ma)
#添加re.I標(biāo)志
ma = re.match(r'name:\w+', 'Name:sun age:10', re.I)
print(ma)結(jié)果:
None
<re.Match object; span=(0, 8), match='Name:sun'>找到字符串中與戶名
#注意,中間的換行\(zhòng)n
s = 'Name:sun age:10\nname:liu, age:9'
#正則表達(dá)式:每行開(kāi)頭開(kāi)始匹配,默認(rèn)處理第一行
result = re.findall(r'^name:\w+', s, re.I)
print(result)輸出結(jié)果:['Name:sun'];我們想要找到所有用戶名?添加re.M,代碼如下:
s = 'Name:sun age:10\nname:liu, age:9'
#re.I | re.M,支持設(shè)置多個(gè)標(biāo)志位
result = re.findall(r'^name:\w+', s, re.I|re.M)
print(result)結(jié)果:['Name:sun', 'name:liu']
字符串:
what = 'I Say:"No!\nNo!"'找出我說(shuō)的話:"No!\nNo!"
匹配規(guī)則,雙引號(hào)中間字符串,實(shí)現(xiàn):
what = 'I Say:"No!\nNo!"'
ma = re.search(r'\".+\"', what)
print(ma)輸出結(jié)果:None;因?yàn)?.'不能匹配'\n',設(shè)置標(biāo)志re.S,實(shí)現(xiàn):
what = 'I Say:"No!\nNo!"'
ma = re.search(r'\".+\"', what, re.S)
print(ma)輸出結(jié)果:
<re.Match object; span=(6, 15), match='"No!\nNo!"'>以上這些就是re模塊常用使用方法及正則表達(dá)式基本語(yǔ)法,后面文章我們?cè)诮榻B正則表達(dá)式更高級(jí)使用。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:Pythonre模塊與正則表達(dá)式詳解-創(chuàng)新互聯(lián)
分享URL:http://chinadenli.net/article14/ceegde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、面包屑導(dǎo)航、用戶體驗(yàn)、微信公眾號(hào)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容