在Python中使用Regex的方法

來源:互聯網
上載者:User
Regex(regular expression)是一種用形式化文法描述的文本匹配模式。在需要處理大量文本處理的應用中有廣泛的使用,我沒使用的編輯器,IDE中的搜尋常用Regex作為搜尋模式。玩過*nix系統的都知道如sed,grep,awk這類的命令,他們是非常強大的文本處理工具。幾乎所有的語言都有對Regex的支援,有的直接在文法中支援,有的使用擴充庫的形式。python使用的就是擴充庫re。

re.search(pattern,string,flag=0)

搜尋文本中的匹配的模式是最常用的.以模式和文本作為輸入,如果有匹配則返回一個Match對象,反之返回None。
每個Match對象包括相關的匹配資訊:原字串、Regex和匹配的文本在字串中的位置。

import re pattern = "this" text = "Does this text match the pattern?" match = re.search(pattern, text) # 返回一個Match對象 print match.re.pattern # 要匹配的Regex"this"print match.string   # 匹配的文本"Does this match the pattern?" print match.start()   # 匹配的開始位置 5print match.end()    # 匹配的結束位置 9

re.compile(pattern,flag=0)
如果程式中頻繁的使用到同一個Regex,每次使用的時候都寫一遍Regex不僅不高效而且會大大增加出錯的幾率,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在匹配的時候會利用儘可能多的輸入,而使用?可以關閉這種貪心行為,只匹配最少的輸入。這之前先說下量詞。

量詞是為了簡化Regex的讀寫而定義的,通用的形式是{m,n},這表示匹配的個數至少是m,最多是n,在','之後不能有空格,否則會出錯,並且均為閉區間。

  • {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" 

對於一些預定義的字元集可以使用轉義碼可以更加緊湊的表示,re可以識別的轉義碼有3對,6個,分別為三個字母的大小寫,他們的意義是相反的。

  • \d : 一個數字
  • \D : 一個非數字
  • \w : 字母或者數字
  • \W : 非字母,非數字
  • \s : 空白符(定位字元,空格,分行符號等)
  • \S : 非空白符

如果想指定匹配的內容在文本的相對位置,可以使用錨定,跟轉義碼類似。

  • ^ 字元或行的開始
  • $ 字元或行的結束
  • \A 字串的開始
  • \Z 字串結束
  • \b 一個單詞開頭或者末尾的空串
  • \B 不在一個單詞開頭或末尾的空串
import rethe_str = "This is some text -- with punctuation" re.search(r'^\w+', the_str).group(0)    # Thisre.search(r'\A\w+', the_str).group(0)   # This re.search(r'\w+\S*$', the_str).group(0)  # punctuation re.search(r'\w+\S*\Z', the_str).group(0)  # punctuation re.search(r'\w*t\W*', the_str).group(0)  # text -- re.search(r'\bt\w+', the_str).group(0)   # text re.search(r'\Bt*\B', the_str).group(0)   # 沒有匹配 

用組來解析匹配,簡單的說就是在一個Regex中有幾個小括弧()將匹配的運算式分成不同的組,使用group()函數來擷取某個組的匹配,其中0為整個Regex所匹配的內容,後面從1開始從左往右依次擷取每個組的匹配,即每個小括弧中的匹配。使用groups()可以擷取所有的匹配內容。

import re the_str = "--aabb123bbaa" pattern = r'(\W+)([a-z]+)(\d+)(\D+)' match = re.search(pattern, the_str)  match.groups()  # ('--', 'aabb', '123', 'bbaa') match.group(0)  # '--aabb123bbaa' match.group(1)  # '--' match.group(2)  # 'aabb' match.group(3)  # '123' match.group(4)  # 'bbaa'

python對分組的文法做了擴充,我們可以對每個分組進行命名,這樣便可以使用名稱來調用。文法:(?Ppattern),使用groupdict()可以返回一個包含了組名的字典。

import re the_str = "--aabb123bbaa" pattern = r'(?P\W+)(?P[a-z]+)(?P\d+)(?P\D+)' match = re.search(pattern, the_str)  match.groups()  # ('--', 'aabb', '123', 'bbaa') match.groupdict() # {'not_al_and_num': '--', 'not_num': 'bbaa', 'num': '123', 'al': 'aabb'} match.group(0)          # '--aabb123bbaa' match.group(1)          # '--' match.group(2)          # 'aabb' match.group(3)          # '123' match.group(4)          # 'bbaa'  match.group('not_al_and_num')  # '--'match.group('al')         # 'aabb' match.group('num')        # '123' 'match.group('not_num')      # 'bbaa'

以上的group()方法在使用的時候需要注意,只有在有匹配的時候才會正常運行,否則會拋錯,所以在不能保證有匹配而又要輸出匹配結果的時候,必須做校正。

在re中可以設定不通的標誌,也就是search()和compile()等中都包含的預設變數flag。使用標誌可以進行完成一些特殊的要求,如忽略大小寫,多行搜尋等。

import re the_str = "this Text" re.findall(r'\bt\w+', the_str)  # ['this'] re.findall(r'\bt\w+', the_str, re.IGNORECASE) # ['this', 'Text'] 
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.