Python re標準庫

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)可選子模式出現與否都可,並且互相獨立;

使用下面這些運算符容許子模式重複屢次:

  • (pattern)*:容許模式重複0次或屢次;
  • (pattern)+:容許模式重複1次或屢次;
  • (pattern){m,n}:容許模式重複m~n次;

例如,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基礎教程》一書

 

持續學習中,,,

相關文章
相關標籤/搜索