python正則表達(dá)式實(shí)例代碼
re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能。
會(huì)用到的語(yǔ)法
正則字符 | 釋義 | 舉例 | ||||||||||||||||||||||||||||||
+ | 前面元素至少出現(xiàn)一次 | ab+:ab、abbbb 等 | ||||||||||||||||||||||||||||||
* | 前面元素出現(xiàn)0次或多次 | ab*:a、ab、abb 等 | ||||||||||||||||||||||||||||||
? | 匹配前面的一次或0次 | Ab?: A、Ab 等 | ||||||||||||||||||||||||||||||
^ | 作為開(kāi)始標(biāo)記 | ^a:abc、aaaaaa等 | ||||||||||||||||||||||||||||||
$ | 作為結(jié)束標(biāo)記 | c$:abc、cccc 等 | ||||||||||||||||||||||||||||||
\d | 數(shù)字 | 3、4、9 等
|
||||||||||||||||||||||||||||||
\D | 非數(shù)字 | A、a、- 等 | ||||||||||||||||||||||||||||||
[a-z] | A到z之間的任意字母 | a、p、m 等 | ||||||||||||||||||||||||||||||
[0-9] | 0到9之間的任意數(shù)字 | 0、2、9 等 |
注意:
1. 轉(zhuǎn)義字符
>>> s '(abc)def' >>> m = re.search("(\(.*\)).*", s) >>> print m.group(1) (abc)
re.match函數(shù)
re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話(huà),match()就返回none。
實(shí)例1:
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match('www', 'www.dbjr.com.cn').span()) # 在起始位置匹配 print(re.match('net', 'www.dbjr.com.cn')) # 不在起始位置匹配
輸出結(jié)果:
(0, 3)
None
實(shí)例2:
#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"
輸出結(jié)果:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
上面是python2的print輸出,python記得加()即可,python輸出類(lèi)似的別的語(yǔ)言的\n之類(lèi)來(lái)匹配獲取的內(nèi)容。
python group()
正則表達(dá)式中,group()用來(lái)提出分組截獲的字符串,()用來(lái)分組
重復(fù)前邊的字串多次
>>> a = "kdlal123dk345" >>> b = "kdlal123345" >>> m = re.search("([0-9]+(dk){0,1})[0-9]+", a) >>> m.group(1), m.group(2) ('123dk', 'dk') >>> m = re.search("([0-9]+(dk){0,1})[0-9]+", b) >>> m.group(1) '12334' >>> m.group(2) >>>
究其因
1. 正則表達(dá)式中的三組括號(hào)把匹配結(jié)果分成三組
group() 同group(0)就是匹配正則表達(dá)式整體結(jié)果
group(1) 列出第一個(gè)括號(hào)匹配部分,group(2) 列出第二個(gè)括號(hào)匹配部分,group(3) 列出第三個(gè)括號(hào)匹配部分。
2. 沒(méi)有匹配成功的,re.search()返回None
3. 當(dāng)然正則表達(dá)式中沒(méi)有括號(hào),group(1)肯定不對(duì)了。
示例
1. 判斷字符串是否是全部小寫(xiě)
# -*- coding: cp936 -*- import re s1 = 'adkkdk' s2 = 'abc123efg' an = re.search('^[a-z]+$', s1) if an: print 's1:', an.group(), '全為小寫(xiě)' else: print s1, "不全是小寫(xiě)!" an = re.match('[a-z]+$', s2) if an: print 's2:', an.group(), '全為小寫(xiě)' else: print s2, "不全是小寫(xiě)!"
結(jié)果
究其因
1. 正則表達(dá)式不是python的一部分,利用時(shí)需要引用re模塊
2. 匹配的形式為: re.search(正則表達(dá)式, 帶匹配字串)或re.match(正則表達(dá)式, 帶匹配字串)。兩者區(qū)別在于后者默認(rèn)以開(kāi)始符(^)開(kāi)始。因此,
re.search('^[a-z]+$', s1) 等價(jià)于 re.match('[a-z]+$', s2)
3. 如果匹配失敗,則an = re.search('^[a-z]+$', s1)返回None
group用于把匹配結(jié)果分組
例如
import re a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整體 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
輸出結(jié)果
123abc456
123
abc
456
1)正則表達(dá)式中的三組括號(hào)把匹配結(jié)果分成三組
group() 同group(0)就是匹配正則表達(dá)式整體結(jié)果
group(1) 列出第一個(gè)括號(hào)匹配部分,group(2) 列出第二個(gè)括號(hào)匹配部分,group(3) 列出第三個(gè)括號(hào)匹配部分。
2)沒(méi)有匹配成功的,re.search()返回None
3)當(dāng)然正則表達(dá)式中沒(méi)有括號(hào),group(1)肯定不對(duì)了。
2. 首字母縮寫(xiě)詞擴(kuò)充
具體示例
FEMA Federal Emergency Management Agency
IRA Irish Republican Army
DUP Democratic Unionist Party
FDA Food and Drug Administration
OLC Office of Legal Counsel
分析
縮寫(xiě)詞 FEMA
分解為 F*** E*** M*** A***
規(guī)律 大寫(xiě)字母 + 小寫(xiě)(大于等于1個(gè))+ 空格
參考代碼
import re def expand_abbr(sen, abbr): lenabbr = len(abbr) ma = '' for i in range(0, lenabbr): ma += abbr[i] + "[a-z]+" + ' ' print 'ma:', ma ma = ma.strip(' ') p = re.search(ma, sen) if p: return p.group() else: return '' print expand_abbr("Welcome to Algriculture Bank China", 'ABC')
結(jié)果
問(wèn)題
上面代碼對(duì)于例子中的前3個(gè)是正確的,但是后面的兩個(gè)就錯(cuò)了,因?yàn)榇髮?xiě)字母開(kāi)頭的詞語(yǔ)之間還夾雜著小寫(xiě)字母詞
規(guī)律
大寫(xiě)字母 + 小寫(xiě)(大于等于1個(gè))+ 空格 + [小寫(xiě)+空格](0次或1次)
參考代碼
import re def expand_abbr(sen, abbr): lenabbr = len(abbr) ma = '' for i in range(0, lenabbr-1): ma += abbr[i] + "[a-z]+" + ' ' + '([a-z]+ )?' ma += abbr[lenabbr-1] + "[a-z]+" print 'ma:', ma ma = ma.strip(' ') p = re.search(ma, sen) if p: return p.group() else: return '' print expand_abbr("Welcome to Algriculture Bank of China", 'ABC')
技巧
中間的 小寫(xiě)字母集合+一個(gè)空格,看成一個(gè)整體,就加個(gè)括號(hào)。要么同時(shí)有,要么同時(shí)沒(méi)有,這樣需要用到?,匹配前方的整體。
3. 去掉數(shù)字中的逗號(hào)
具體示例
在處理自然語(yǔ)言時(shí)123,000,000如果以標(biāo)點(diǎn)符號(hào)分割,就會(huì)出現(xiàn)問(wèn)題,好好的一個(gè)數(shù)字就被逗號(hào)肢解了,因此可以先下手把數(shù)字處理干凈(逗號(hào)去掉)。
分析
數(shù)字中經(jīng)常是3個(gè)數(shù)字一組,之后跟一個(gè)逗號(hào),因此規(guī)律為:***,***,***
正則式
[a-z]+,[a-z]?
參考代碼3-1
import re sen = "abc,123,456,789,mnp" p = re.compile("\d+,\d+?") for com in p.finditer(sen): mm = com.group() print "hi:", mm print "sen_before:", sen sen = sen.replace(mm, mm.replace(",", "")) print "sen_back:", sen, '\n'
結(jié)果
技巧
使用函數(shù)finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜索string,返回一個(gè)順序訪(fǎng)問(wèn)每一個(gè)匹配結(jié)果(Match對(duì)象)的迭代器。
參考代碼3-2
sen = "abc,123,456,789,mnp" while 1: mm = re.search("\d,\d", sen) if mm: mm = mm.group() sen = sen.replace(mm, mm.replace(",", "")) print sen else: break
結(jié)果
延伸
這樣的程序針對(duì)具體問(wèn)題,即數(shù)字3位一組,如果數(shù)字混雜與字母間,干掉數(shù)字間的逗號(hào),即把“abc,123,4,789,mnp”轉(zhuǎn)化為“abc,1234789,mnp”
思路
更具體的是找正則式“數(shù)字,數(shù)字”找到后用去掉逗號(hào)的替換
參考代碼3-3
sen = "abc,123,4,789,mnp" while 1: mm = re.search("\d,\d", sen) if mm: mm = mm.group() sen = sen.replace(mm, mm.replace(",", "")) print sen else: break print sen
結(jié)果
4. 中文處理之年份轉(zhuǎn)換(例如:一九四九年--->1949年)
中文處理涉及到編碼問(wèn)題。例如下邊的程序識(shí)別年份(****年)時(shí)
# -*- coding: cp936 -*- import re m0 = "在一九四九年新中國(guó)成立" m1 = "比一九九零年低百分之五點(diǎn)二" m2 = '人一九九六年擊敗俄軍,取得實(shí)質(zhì)獨(dú)立' def fuc(m): a = re.findall("[零|一|二|三|四|五|六|七|八|九]+年", m) if a: for key in a: print key else: print "NULL" fuc(m0) fuc(m1) fuc(m2)
運(yùn)行結(jié)果
可以看出第二個(gè)、第三個(gè)都出現(xiàn)了錯(cuò)誤。
改進(jìn)——準(zhǔn)化成unicode識(shí)別
# -*- coding: cp936 -*- import re m0 = "在一九四九年新中國(guó)成立" m1 = "比一九九零年低百分之五點(diǎn)二" m2 = '人一九九六年擊敗俄軍,取得實(shí)質(zhì)獨(dú)立' def fuc(m): m = m.decode('cp936') a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", m) if a: for key in a: print key else: print "NULL" fuc(m0) fuc(m1) fuc(m2)
結(jié)果
識(shí)別出來(lái)可以通過(guò)替換方式,把漢字替換成數(shù)字。
參考
numHash = {} numHash['零'.decode('utf-8')] = '0' numHash['一'.decode('utf-8')] = '1' numHash['二'.decode('utf-8')] = '2' numHash['三'.decode('utf-8')] = '3' numHash['四'.decode('utf-8')] = '4' numHash['五'.decode('utf-8')] = '5' numHash['六'.decode('utf-8')] = '6' numHash['七'.decode('utf-8')] = '7' numHash['八'.decode('utf-8')] = '8' numHash['九'.decode('utf-8')] = '9' def change2num(words): print "words:",words newword = '' for key in words: print key if key in numHash: newword += numHash[key] else: newword += key return newword def Chi2Num(line): a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", line) if a: print "------" print line for words in a: newwords = change2num(words) print words print newwords line = line.replace(words, newwords) return line
5. 多個(gè)手機(jī)號(hào)碼,中間用|隔開(kāi)
舉例:
空值
12222222222
12222222222|12222222222
12222222222|12222222222|12222222444
表達(dá)式
s = "[\\d]{11}(\\|[\\d]{11})*|"
四. 推薦
到此這篇關(guān)于python正則表達(dá)式實(shí)例代碼的文章就介紹到這了,更多相關(guān)python正則例子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python正則表達(dá)式學(xué)習(xí)小例子
- Python編程快速上手——正則表達(dá)式查找功能案例分析
- python 正則表達(dá)式參數(shù)替換實(shí)例詳解
- python正則表達(dá)式匹配IP代碼實(shí)例
- python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
- Python 正則表達(dá)式爬蟲(chóng)使用案例解析
- Python正則表達(dá)式實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能示例
- python正則表達(dá)式匹配[]中間為任意字符的實(shí)例
- python 使用正則表達(dá)式按照多個(gè)空格分割字符的實(shí)例
- Python爬蟲(chóng)之正則表達(dá)式基本用法實(shí)例分析
- python 用正則表達(dá)式篩選文本信息的實(shí)例
- Python3使用正則表達(dá)式爬取內(nèi)涵段子示例
- python的re正則表達(dá)式實(shí)例代碼
- python正則表達(dá)式及使用正則表達(dá)式的例子
- python里使用正則表達(dá)式的組嵌套實(shí)例詳解
- 學(xué)會(huì)Python正則表達(dá)式,就看這20個(gè)例子(腳本之家修正版)
相關(guān)文章
Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法
今天小編就為大家分享一篇Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python實(shí)現(xiàn)自動(dòng)更換ip的方法
這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)更換ip的方法,涉及Python針對(duì)本機(jī)網(wǎng)絡(luò)配置的相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例
這篇文章主要介紹了在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式
這篇文章主要介紹了數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04python異步編程 使用yield from過(guò)程解析
這篇文章主要介紹了python異步編程 使用yield from過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python實(shí)現(xiàn)分?jǐn)?shù)序列求和
今天小編就為大家分享一篇Python實(shí)現(xiàn)分?jǐn)?shù)序列求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02如何解決requests,已經(jīng)安裝卻無(wú)法import問(wèn)題
這篇文章主要介紹了如何解決requests,已經(jīng)安裝卻無(wú)法import問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量
這篇文章主要介紹了keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03詳解Python結(jié)合Genetic?Algorithm算法破解網(wǎng)易易盾拼圖驗(yàn)證
很多網(wǎng)站在登錄或者注冊(cè)時(shí)都會(huì)遇到拼圖驗(yàn)證碼,這種拼圖驗(yàn)證碼實(shí)際上是多個(gè)小碎片經(jīng)過(guò)重新組合成的一張整體。本文將和大家分享一個(gè)基于Python?Genetic?Algorithm的破解拼圖驗(yàn)證碼的辦法,需要的可以參考一下2022-02-02