re模塊包含對正則表達式的支持。python
1、什麼是正則表達式正則表達式
正則表達式是能夠匹配文本片斷的模式。最簡單的正則表達是就是普通字符串,能夠匹配其自身。你能夠用這種匹配行爲搜索文本中的模式,或者用計算後的值替換特定模式,或者將文本進行分段。函數
一、通配符oop
點號(.)能夠匹配任何字符(除了換行符),但點號只能匹配一個字符,而不是零個或多個;學習
如.ython能夠匹配字符串‘python’或‘jython’,或‘+ython’等等,可是不會匹配‘cpython’或‘ython’;this
由於它能夠匹配除換行符外的任何單個字符,因此點號就稱爲通配符。spa
注:點號是特殊字符,需對它進行轉義。能夠加上反斜線「cnblogs\\.com」或者使用原始字符串「r'cnblogs\.com'」;code
二、字符集對象
可使用中括號括住字符串來建立字符集。字符集能夠匹配它所包括的任意字符;blog
如‘[pj]ython’能夠匹配python或jython;好比‘[a-z]’能夠匹配a到z的任意一個字符;
也能夠經過一個接一個的方式將範圍聯合起來使用,好比‘[a-zA-Z0-9]’能夠匹配任意一個小寫或大寫字母或0到9的數字;
能夠在開頭使用‘^’反轉字符集,匹配除字符集外的其它字符;如‘[^abc]’能夠匹配任何除了a\b\c以外的字符。
三、選擇符和子模式
管道符號(|)能夠用於選擇項;如匹配python和perl,能夠寫成‘python|perl’
當只是模式的一部分進行選擇時,可使用圓括號括起須要的部分,或稱爲子模式。如匹配python和perl,能夠寫成‘p(ython|erl)’
四、可選項和重複子模式
在子模式後面加上句號,它就變成了可選項,即表示子模式能夠出現一次或者根本不出現。
如r'(http://)?(www\.)?python\.org'只能匹配到下列字符串,而不會匹配其它的:
http://python.org
http://www.python.org
www.python.org
python.org
上述例子,值得注意的是:
(1)對www.和python.org之間的點號進行了轉義,防止它被做爲通配符使用;
(2)使用原始字符串「r」減小所需反斜線的數量;
(3)每一個可選子模式都用圓括號括起;
(4)可選子模式出現與否都可,並且互相獨立;
使用下面這些運算符容許子模式重複屢次:
例如,r'w*\.python\.org'會匹配'www.python.org',也會匹配'.python.org’;
五、字符串的開始和結尾
若是想在字符串的開頭而不是其餘位置匹配,可使用脫字符(^)標記開始;
如‘^ht+p’會匹配‘http://python.org’或'htttp://python.org',但不匹配‘www.http.org’;
使用美圓符號($)標誌字符串結尾。
2、re模塊的內容
re模塊包含一些有用的操做正則表達式的函數:
函數re.compile將正則表達式(以字符串書寫的)轉換爲模式對象,能夠實現更有效率的匹配。若是調用search或者match函數的時候使用字符串表示的正則表達式,它們也會在內部將字符串轉換爲正則表達式對象。 使用compile完成一次轉換後,在每次使用模式的時候就不用進行轉換。
函數re.search會在給定字符串中尋找第一個匹配給定正則表達式的子字符串。一旦找到子字符串,函數就會返回MathObject(值爲True),不然返回None(值爲False)。
函數re.match會在給定字符串的開頭匹配正則表達式。如match('p','python')返回真,而re.match('p','www.python')則返回假。
函數re.split會根據模式的匹配項來分隔字符串。參數maxsplit表示字符串最多能夠分隔的次數:
import re text = 'a,b,,,,c d'
#
#正則表達式中,匹配逗號和空格 listvalue = re.split('[, ]+',text) print(listvalue) #['a', 'b', 'c', 'd'] print(re.split('o(o)','foobar')) #['f', 'o', 'bar'] print(re.split('[, ]+',text,maxsplit=1)) #['a', 'b,,,,c d']
函數re.findall以列表形式返回給定模式的全部匹配項。
pat = '[a-zA-Z]' text2 = '"aq," bp,,,,ct rd' print(re.findall(pat,text2)) #['a', 'q', 'b', 'p', 'c', 't', 'r', 'd']
函數re.sub的做用在於:使用給定的替換內容將匹配模式的子字符串(最左端而且非重疊的子字符串)替換掉。
pat3 = '{name}' text3 = 'Dear {name}' print(re.sub(pat3, 'Jame', text3)) #Dear Jame
函數re.escape能夠對字符串中全部可能被解釋爲正則運算符的字符進行轉義。
print(re.escape('www.python.org')) #www\.python\.org
3、匹配對象和組
re模塊函數能找到匹配項時,它們會返回MathObject對象,這些對象包括匹配模式的子字符串的信息,它們還包含了哪一個模式匹配了子字符串哪部分的信息,這些部分叫作組(group)。
即組就是放置在圓括號內的子模式。組的序號取決於它左側的括號數。組0就是整個模式。
如在下面的模式中:‘there (was a (wee) (cooper)) who (lived in fyfe)’,包含下面這些組:
0 there was a wee cooper who lived in fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in fyfe
注:這裏要區分前面提到的字符集,字符集兩邊是用中括號括起的,而組是用原括號括起的。
如r'www\.(.+)\.com$' 能夠匹配'www.python.com';組0就是‘www.python.com’,組1就是python。
re匹配對象存在如下重要方法:
上訴方法中,[group1]指的是組號。若是沒有給定組號,則默認爲組0.
m = re.match(r'www\.(.*)\..{3}', 'www.python.org') print(m.group(1)) #python print(m.start(1)) #4 print(m.end(1)) #10 print(m.span(1)) #(4, 10)
重複運算符的匹配是貪婪的,即它會盡量多的匹配。
在重複運算符後面加上一個問號能夠變爲非貪婪的。
pat4 = r'\*\*(.+?)\*\*' pat5 = r'\*\*(.+)\*\*' print(re.sub(pat4,r'<em>\1</em>','**this** is **it**!')) #<em>this</em> is <em>it</em>! print(re.sub(pat5,r'<em>\1</em>','**this** is **it**!')) #<em>this** is **it</em>!
這裏用+?運算符代替了+,意味着模式也會像以前那樣對一個或者多個通配符進行匹配,可是它會進行儘量少的匹配,由於它是非貪婪的。
讓正則表達式變得更加易讀的方式是在re函數中使用VERBOSE標誌:
em_pat = re.compile(r''' \* #匹配的第一個字符是星號 \* #匹配的第二個字符是星號,這裏前面斜槓是轉義 ( #匹配組左側圓括號 . #匹配任意字符 + #任意字符能夠是1個或多個 ) #匹配組右側括號 \*\* #匹配的字符後面跟着兩個星號 ''',re.VERBOSE) print(re.sub(em_pat,r'<em>\1</em>','**this** is **it**!')) #<em>this** is **it</em>!
4、實例
文件中存在如下文字:
From foo@bar.baz Thu Dec
Subjec:Re:Span
From:Foo fie <foo@bar.baz>
to:Magnus <magnus@bozz.floop>
如今要從文件中找出是誰發送的郵件,咱們能夠在‘From:Foo fie <foo@bar.baz>’中找到發件人Foo fie.實現查找:
pat6 = re.compile('From:(.*) <.*?>$') for line in fileinput.input(): m = pat6.match(line) if m:print m.group(1)
本文主要摘自《Python基礎教程》一書
持續學習中,,,