首頁  >  文章  >  後端開發  >  Python正規表示式

Python正規表示式

高洛峰
高洛峰原創
2016-10-19 16:37:061210瀏覽

正規表示式是搜尋、取代和解析複雜字串的一種強大而標準的方法,Python中的正規相關的東西全在re模組下。

1 常用的匹配

^匹配字串的開始

$匹配字串的結尾

b匹配一個單字的邊界

d匹配任意數字

?D匹配一個非數字字符

d匹配任意數字

?一個匹配一個

可選的x(符合1次或0次x字元)

x*符合0次或多次x

x+符合1次或多次x

x{n,m}至少n次,至多m次x

(a|b|c)要么匹配a,要么匹配b,要么匹配c

(x)一般情況下表示一個記憶組,你可以利用re.search函數返回對象的groups()函數來獲取它的值

2 一般用途

#-------------------------------------------------------------------------------
# coding:        utf-8
# Purpose:正则表达式
#
# Author:      zdk
#
# Created:     26/02/2013
# Copyright:   (c) zdk 2013
#-------------------------------------------------------------------------------
  
import re
if __name__ == '__main__':
    addr = "100 BROAD ROAD APT.3"
    print(re.sub("ROAD","RD",addr)) # 100 BRD RD APT.3
    print(re.sub(r"\bROAD\b","RD",addr)) # 100 BROAD RD APT.3
    pattern = ".*B.*(ROAD)?"
    print(re.search(pattern,"ROAD")) #None
    print(re.search(pattern,"B")) #<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, Consolas, &#39;Courier New&#39;, monospace;font-size:1em;line-height:1.5;"> </span>

(1)re.sub("ROAD","RD",addr) 利用re.sub函數對字串addr進行搜索,滿足表達式"ROAD"的用「RD ”替換

(2)re.sub(r"bROADb","RD",addr) ,“b”含義是“單詞的邊界”,在Python中,由於字符“”在字符串中必須轉義,這會變得非常麻煩,所以Python用前綴r表示字串中的所有字元都不轉義。

(3)re.search(pattern,"ROAD") re模組有一個search函數,該函數有兩個參數,一個是正規表示式,一個是字串,search函數傳回一個擁有多種方法可以描述這個匹配的對象,如果沒有發現匹配,則返回None。  

3 鬆散正規表示式

上面都是「緊湊」類型的表達式,它比較難以閱讀,即使現在清楚表達式的含義,也不能保證幾個月後還能記得。所以Python允許使用者利用所謂的鬆散正規表示式來完成內聯文檔的需要,和一般的表達式有以下兩個方面的主要區別

忽略空白符。空格符、製表符、回車符不匹配它們本身(如果你想在鬆散正則表達式中匹配一個空格符,你不須在它前面添加一個反斜杠符號對它進行轉義)

忽略註釋。和普通的Python程式碼一樣,註解開始於#符號,結束於行尾。

#松散带有内联注释的正则表达式
    pattern = """
    ^   # begin of string
    M{0,3} # 0 to 3 M
    (CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C
    $   #end of string
    """
    print(re.search(pattern,"MCM",re.VERBOSE)) #<_sre.SRE_Match object at 0x021BAF60>
    print(re.search(pattern,"M99",re.VERBOSE)) #None

(1)當使用鬆散正則表達式時,最重要的一件事是:必須傳遞一個額外的參數re.VERBOSE,它是re模組的一個常數,標誌著待匹配的正則表達式是一個鬆散正規表示式。 pattern的空格和註解都是被忽略的,但同時具有更好的可讀性。

4 個範例研究:解析電話號碼

必須符合下列電話號碼:

800-555-1212

800 555 00-555 -1212

800-555-1212-1234

800-555-1212x1234

800-555-1212 ext.1234

800-555-1212 ext.1234

800-555-1212 ext.1234

800-555-1212 ext.1234

多,我們需要知道的是800為區號,幹線號為555,電話號的其他數字為1212,對於有分機號的,我們需要知道分機號為1234

phonePattern = re.compile(r&#39;&#39;&#39;
    # don&#39;t match beginging of string
(\d{3}) # 3 digits
\D*     #any number of non-digits
(\d{3}) # 3 digits
\D*     #any number of non-digits
(\d{4}) # 4 digits
\D*     #any number of non-digits
(\d*)   #any number of digits
&#39;&#39;&#39;,re.VERBOSE)
print(phonePattern.search(&#39;work 1-(800)555.1212 #1234&#39;).groups()) #(&#39;800&#39;, &#39;555&#39;, &#39;1212&#39;, &#39;1234&#39;)

print(phonePattern.search('work 1-(800)555.1212 # 1234').groups()) #('800', '555', '1212', '1234')

(1)一個鬆散正則表達式如上, 首先匹配3個數字區號(不一定從第一個字符開始,所以沒有用^),接著後面匹配任意多個非數字的字符,接著匹配3個數字幹線號,接著匹配任意多個非數字的字符,接著匹配4個數字號碼,接著匹配任意多個非數字的字符,接著匹配任意多個數字的分機號,然後用groups函數分組,得到正確的電話號碼。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn