Python正則表達式(1)


正則表達式(regular expression)是一種用形式化語法描述的文本匹配模式。在須要處理大量文本處理的應用中有普遍的使用,我沒使用的編輯器,IDE中的搜索經常使用正則表達式做爲搜索模式。玩過*nix系統的都知道如sed,grep,awk這類的命令,他們是很是強大的文本處理工具。幾乎全部的語言都有對正則表達式的支持,有的直接在語法中支持,有的使用擴展庫的形式。python使用的就是擴展庫re。python

  • re.search(pattern,string,flag=0)
    搜索文本中的匹配的模式是最經常使用的.以模式和文本做爲輸入,若是有匹配則返回一個Match對象,反之返回None。
    每一個Match對象包括相關的匹配信息:原字符串、正則表達式和匹配的文本在字符串中的位置。
import re  
pattern = "this"  
text = "Does this text match the pattern?"  
match = re.search(pattern, text)  # 返回一個Match對象  
print match.re.pattern  # 要匹配的正則表達式"this"
print match.string      # 匹配的文本"Does this match the pattern?"  
print match.start()     # 匹配的開始位置 5
print match.end()       # 匹配的結束位置 9
  • re.compile(pattern,flag=0)
    若是程序中頻繁的使用到同一個正則表達式,每次使用的時候都寫一遍正則表達式不只不高效並且會大大增長出錯的概率,re提供了compile函數將一個表達式字符串編譯爲一個RegexObject。
    模塊級函數會維護已編譯表達式的一個緩存,而這個緩存是的大小是有限制的。直接使用已經編譯的表達式能夠避免緩存查找的開銷,而且在加載模塊時就會預編譯全部的表達式。
import re  
regex = re.compile("this")  
text = "Does this text match the pattern?"  
match = regex.search(text)  
if match:  
    print "match"  
    match.group(0)    #返回匹配的字符串   
else:
    print "not match"
  • re.findall(pattern, string, flag=0)
    使用search會返回匹配的單個實例,使用findall會返回全部匹配的不重疊的子串。
import re  
pattern = 'ab'  
text = 'abbaaabbbbaaaaaa'  
re.findall(pattern, text)   # 返回['ab', 'ab']
  • re.finditer(pattern, string, flag=0)
    finditer會返回一個迭代器,會生成Match實例,不像findall()返回字符串.
import re  
pattern = 'ab'  
text = 'abbaaabbbbaaaaaa'  
match = re.finditer(pattern, text)   
for m in match:
    print m.start()  
    print m.end()

以上的例子會分別輸出兩次匹配結果的起始位置和結束位置。正則表達式

正則匹配默認採用的是貪婪算法,也就是說會re在匹配的時候會利用盡量多的輸入,而使用?能夠關閉這種貪心行爲,只匹配最少的輸入。這以前先說下量詞。算法

量詞是爲了簡化正則表達式的讀寫而定義的,通用的形式是{m,n},這表示匹配的個數至少是m,最可能是n,在','以後不能有空格,不然會出錯,而且均爲閉區間。express

{n} 以前的元素必須出現n次
{m,n} 以前元素最少出現m次,最多n次
{m,} 以前的元素最少出現m次,無上限
{0,n} 以前的元素能夠不出現,也能夠出現,出現的話最多出現n次緩存

除了之上,還有三個經常使用的量詞*,?和+編輯器

* 等價於{0,}
+ 等價於{1,}
\? 等價於{0,1}函數

還有^和$,分別表示段或者字符串的開始與結束。工具

import re  
re.search("^travell?er$", "traveler")    # True  
re.search("^travell?er$", "traveller")   # True   
re.search("^ab\*", "abbbbbbb")           # True,返回"abbbbbbb" 
re.search("^ab\*?", "abbbbbbb")          # True,返回"a"  
re.search("^ab+", "abbbbbbb")            # True,返回"abbbbbbb" 
re.search("^ab+?", "abbbbbbb")           # True,返回"ab"
相關文章
相關標籤/搜索