python正則表達(dá)式實(shí)例代碼
re 模塊使 Python 語言擁有全部的正則表達(dá)式功能。
會用到的語法
正則字符 | 釋義 | 舉例 | ||||||||||||||||||||||||||||||
+ | 前面元素至少出現(xiàn)一次 | ab+:ab、abbbb 等 | ||||||||||||||||||||||||||||||
* | 前面元素出現(xiàn)0次或多次 | ab*:a、ab、abb 等 | ||||||||||||||||||||||||||||||
? | 匹配前面的一次或0次 | Ab?: A、Ab 等 | ||||||||||||||||||||||||||||||
^ | 作為開始標(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è)模式,如果不是起始位置匹配成功的話,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輸出類似的別的語言的\n之類來匹配獲取的內(nèi)容。
python group()
正則表達(dá)式中,group()用來提出分組截獲的字符串,()用來分組
重復(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á)式中的三組括號把匹配結(jié)果分成三組
group() 同group(0)就是匹配正則表達(dá)式整體結(jié)果
group(1) 列出第一個(gè)括號匹配部分,group(2) 列出第二個(gè)括號匹配部分,group(3) 列出第三個(gè)括號匹配部分。
2. 沒有匹配成功的,re.search()返回None
3. 當(dāng)然正則表達(dá)式中沒有括號,group(1)肯定不對了。
示例
1. 判斷字符串是否是全部小寫
# -*- coding: cp936 -*- import re s1 = 'adkkdk' s2 = 'abc123efg' an = re.search('^[a-z]+$', s1) if an: print 's1:', an.group(), '全為小寫' else: print s1, "不全是小寫!" an = re.match('[a-z]+$', s2) if an: print 's2:', an.group(), '全為小寫' else: print s2, "不全是小寫!"
結(jié)果
究其因
1. 正則表達(dá)式不是python的一部分,利用時(shí)需要引用re模塊
2. 匹配的形式為: re.search(正則表達(dá)式, 帶匹配字串)或re.match(正則表達(dá)式, 帶匹配字串)。兩者區(qū)別在于后者默認(rèn)以開始符(^)開始。因此,
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á)式中的三組括號把匹配結(jié)果分成三組
group() 同group(0)就是匹配正則表達(dá)式整體結(jié)果
group(1) 列出第一個(gè)括號匹配部分,group(2) 列出第二個(gè)括號匹配部分,group(3) 列出第三個(gè)括號匹配部分。
2)沒有匹配成功的,re.search()返回None
3)當(dāng)然正則表達(dá)式中沒有括號,group(1)肯定不對了。
2. 首字母縮寫詞擴(kuò)充
具體示例
FEMA Federal Emergency Management Agency
IRA Irish Republican Army
DUP Democratic Unionist Party
FDA Food and Drug Administration
OLC Office of Legal Counsel
分析
縮寫詞 FEMA
分解為 F*** E*** M*** A***
規(guī)律 大寫字母 + 小寫(大于等于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é)果
問題
上面代碼對于例子中的前3個(gè)是正確的,但是后面的兩個(gè)就錯(cuò)了,因?yàn)榇髮懽帜搁_頭的詞語之間還夾雜著小寫字母詞
規(guī)律
大寫字母 + 小寫(大于等于1個(gè))+ 空格 + [小寫+空格](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')
技巧
中間的 小寫字母集合+一個(gè)空格,看成一個(gè)整體,就加個(gè)括號。要么同時(shí)有,要么同時(shí)沒有,這樣需要用到?,匹配前方的整體。
3. 去掉數(shù)字中的逗號
具體示例
在處理自然語言時(shí)123,000,000如果以標(biāo)點(diǎn)符號分割,就會出現(xiàn)問題,好好的一個(gè)數(shù)字就被逗號肢解了,因此可以先下手把數(shù)字處理干凈(逗號去掉)。
分析
數(shù)字中經(jīng)常是3個(gè)數(shù)字一組,之后跟一個(gè)逗號,因此規(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è)順序訪問每一個(gè)匹配結(jié)果(Match對象)的迭代器。
參考代碼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é)果
延伸
這樣的程序針對具體問題,即數(shù)字3位一組,如果數(shù)字混雜與字母間,干掉數(shù)字間的逗號,即把“abc,123,4,789,mnp”轉(zhuǎn)化為“abc,1234789,mnp”
思路
更具體的是找正則式“數(shù)字,數(shù)字”找到后用去掉逗號的替換
參考代碼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年)
中文處理涉及到編碼問題。例如下邊的程序識別年份(****年)時(shí)
# -*- coding: cp936 -*- import re m0 = "在一九四九年新中國成立" 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識別
# -*- coding: cp936 -*- import re m0 = "在一九四九年新中國成立" 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ù)字。
參考
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ī)號碼,中間用|隔開
舉例:
空值
12222222222
12222222222|12222222222
12222222222|12222222222|12222222444
表達(dá)式
s = "[\\d]{11}(\\|[\\d]{11})*|"
四. 推薦
到此這篇關(guān)于python正則表達(dá)式實(shí)例代碼的文章就介紹到這了,更多相關(guān)python正則例子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python正則表達(dá)式學(xué)習(xí)小例子
- Python編程快速上手——正則表達(dá)式查找功能案例分析
- python 正則表達(dá)式參數(shù)替換實(shí)例詳解
- python正則表達(dá)式匹配IP代碼實(shí)例
- python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
- Python 正則表達(dá)式爬蟲使用案例解析
- Python正則表達(dá)式實(shí)現(xiàn)簡易計(jì)算器功能示例
- python正則表達(dá)式匹配[]中間為任意字符的實(shí)例
- python 使用正則表達(dá)式按照多個(gè)空格分割字符的實(shí)例
- Python爬蟲之正則表達(dá)式基本用法實(shí)例分析
- python 用正則表達(dá)式篩選文本信息的實(shí)例
- Python3使用正則表達(dá)式爬取內(nèi)涵段子示例
- python的re正則表達(dá)式實(shí)例代碼
- python正則表達(dá)式及使用正則表達(dá)式的例子
- python里使用正則表達(dá)式的組嵌套實(shí)例詳解
- 學(xué)會Python正則表達(dá)式,就看這20個(gè)例子(腳本之家修正版)
相關(guān)文章
Centos 升級到python3后pip 無法使用的解決方法
今天小編就為大家分享一篇Centos 升級到python3后pip 無法使用的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例
這篇文章主要介紹了在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式
這篇文章主要介紹了數(shù)據(jù)可視化Pyecharts的實(shí)際使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Python實(shí)現(xiàn)分?jǐn)?shù)序列求和
今天小編就為大家分享一篇Python實(shí)現(xiàn)分?jǐn)?shù)序列求和,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02如何解決requests,已經(jīng)安裝卻無法import問題
這篇文章主要介紹了如何解決requests,已經(jīng)安裝卻無法import問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量
這篇文章主要介紹了keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03詳解Python結(jié)合Genetic?Algorithm算法破解網(wǎng)易易盾拼圖驗(yàn)證
很多網(wǎng)站在登錄或者注冊時(shí)都會遇到拼圖驗(yàn)證碼,這種拼圖驗(yàn)證碼實(shí)際上是多個(gè)小碎片經(jīng)過重新組合成的一張整體。本文將和大家分享一個(gè)基于Python?Genetic?Algorithm的破解拼圖驗(yàn)證碼的辦法,需要的可以參考一下2022-02-02