首頁  >  文章  >  後端開發  >  Python標準庫學習re模組的詳細介紹

Python標準庫學習re模組的詳細介紹

高洛峰
高洛峰原創
2017-03-21 09:15:062068瀏覽

  re模組提供了一系列功能強大的正規表示式(regular expression)工具,它們允許你快速檢查給定字串是否與給定的模式匹配( match函數), 或包含這個模式(search函數)。正規表示式是以緊湊(也很神秘)的語法寫出的字串模式。

1. 常用方法

##match (pattern, 如果字串string的開頭和正規表示式pattern符合傳回對應的Matchsearch(pattern, string, flags=0)#掃描string,如果有個位置可以符合正規表示式pattern,就傳回一個MatchObject的實例,否則返回Nonesub(pattern, repl, string, 將string裡配對pattern的部分,用repl替換掉,最多替換count次subn(pattern, repl, string, count=0, flags=0)和sub類似,subn回傳的是一個替換後的字串和匹配次
常用方法 #描述
string, flags=0) Object的實例,否則傳回None
count=0, flags=0)
數組成的元組
split(pattern, string, maxsplit=0, flags=0) 用pattern匹配到的字串來分割string
findall(pattern, string, flags=0) 以清單的形式傳回string裡符合pattern的字串
compile( pattern, flags=0)compile(pattern, flags=0) 把一個正規表示式pattern編譯成正規物件,以便可以用正規物件的match和search方法
purge() Clear the regular expression cache
escape(string ) 把string中除了字母和數字以外的字符,都加上反斜桿

2. 特殊匹配符

##匹配前一個字元1次或多次?匹配前一個字元0次或一次
語法 說明
. 匹配除了換行符號外的任何字元
^ 頭匹配
$ 尾匹配
* 匹配前一個字元0次或多次
+
######### #{m,n} 符合前一個字元m至n次
\ 對任一特殊字元進行轉義
#[] 用來表示一個字元集
| #或,代表左右任意匹配一個

3. 模組方法

re.match(pattern, string, flags=0)

  從字串的開始匹配,如果pattern匹配到就返回一個Match物件實例(Match物件在後面描述),否則放回None。 flags為匹配模式(會在下面描述),用來控制正規表示式的匹配方式。

import re

a = &#39;abcdefg&#39;print re.match(r&#39;abc&#39;, a)  # 匹配成功print re.match(r&#39;abc&#39;, a).group()print re.match(r&#39;cde&#39;, a)  # 匹配失败>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>abc
>>>None

search(pattern, string, flags=0)

  用於尋找字串中可以符合成功的子字串,如果找到就傳回一個Match物件實例,否則傳回None。

import re

a = &#39;abcdefg&#39;print re.search(r&#39;bc&#39;, a)print re.search(r&#39;bc&#39;, a).group()print re.search(r&#39;123&#39;, a)

>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>bc
>>>None

sub(pattern, repl, string, count=0, flags=0)

  替換,將string裡匹配pattern的部分,用repl替換掉,最多替換count次(剩餘的匹配將不做處理),然後傳回替換後的字串。

import re

a = &#39;a1b2c3&#39;print re.sub(r&#39;\d+&#39;, &#39;0&#39;, a)  # 将数字替换成&#39;0&#39;print re.sub(r&#39;\s+&#39;, &#39;0&#39;, a)  # 将空白字符替换成&#39;0&#39;>>>a0b0c0
>>>a1b2c3

subn(pattern, repl, string, count=0, flags=0)

  跟sub()函數一樣,只是它回傳的是一個元組,包含新字串和配對到的次數

import re

a = &#39;a1b2c3&#39;print re.subn(r&#39;\d+&#39;, &#39;0&#39;, a)  # 将数字替换成&#39;0&#39;>>>(&#39;a0b0c0&#39;, 3)

split(pattern, string, maxsplit=0, flags=0)

  正規版的split(),用符合pattern的子字串來分割string,如果pattern裡面使用了圓括號,那麼被pattern符合的字串也會作為傳回值清單的一部分,maxsplit為最多被分割的字串。

import re

a = &#39;a1b1c&#39;print re.split(r&#39;\d&#39;, a)print re.split(r&#39;(\d)&#39;, a)

>>>[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
>>>[&#39;a&#39;, &#39;1&#39;, &#39;b&#39;, &#39;1&#39;, &#39;c&#39;]

findall(pattern, string, flags=0)

#  以列表的形式傳回string裡符合pattern的不重疊的子字串。

import re

a = &#39;a1b2c3d4&#39;print re.findall(&#39;\d&#39;, a)

>>>[&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;]

4. Match對象

  re.match()、re.search()成功匹配的話都會返回一個Match對象,它包含了很多此次匹配的信息,可以使用Match提供的屬性或方法來取得這些資訊。例如:

>>>import re

>>>str = &#39;he has 2 books and 1 pen&#39;
>>>ob = re.search(&#39;(\d+)&#39;, str)

>>>print ob.string  # 匹配时使用的文本
he has 2 books and 1 pen

>>>print ob.re # 匹配时使用的Pattern对象
re.compile(r&#39;(\d+)&#39;)

>>>print ob.group()  # 获得一个或多个分组截获的字符串
2

>>>print ob.groups()  # 以元组形式返回全部分组截获的字符串
(&#39;2&#39;,)

5.Pattern物件

  Pattern物件物件由re.compile()傳回,它帶有許多re模組的同名方法,而且方法作用類似一樣的。例如:

>>>import re
>>>pa = re.compile(&#39;(d\+)&#39;)

>>>print pa.split(&#39;he has 2 books and 1 pen&#39;)
[&#39;he has &#39;, &#39;2&#39;, &#39; books and &#39;, &#39;1&#39;, &#39; pen&#39;]

>>>print pa.findall(&#39;he has 2 books and 1 pen&#39;)
[&#39;2&#39;, &#39;1&#39;]

>>>print pa.sub(&#39;much&#39;, &#39;he has 2 books and 1 pen&#39;)
he has much books and much pen

6.匹配模式

  匹配模式取值可以使用位元或運算子'|'表示同時生效,例如re.I | re. M, 下面是常見的一些flag。

  • re.I(re.IGNORECASE): 忽略大小寫

#
>>>pa = re.compile(&#39;abc&#39;, re.I)
>>>pa.findall(&#39;AbCdEfG&#39;)
>>>[&#39;AbC&#39;]
  • re.L(re.LOCALE ):字元集本地化

  這個功能是為了支援多語言版本的字元集使用環境的,例如在轉義符\w,在英文環境下,它代表[a-zA-Z0-9],即所以英文字元和數字。如果在一個法語環境下使用,有些法語字串便匹配不上。加上這L選項和就可以配對了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字元。

  • re.M(re.MULTILINE): 多行模式,改變'^'與'$'的行為

>>>pa = re.compile(&#39;^\d+&#39;)
>>>pa.findall(&#39;123 456\n789 012\n345 678&#39;)
>>>[&#39;123&#39;]

>>>pa_m = re.compile(&#39;^\d+&#39;, re.M)
>>>pa_m.findall(&#39;123 456\n789 012\n345 678&#39;)
>>>[&#39;123&#39;, &#39;789&#39;, &#39;345&#39;]
  • re.S(re.DOTALL): 點任意配對模式,改變'.'的行為

  .号将匹配所有的字符。缺省情况下.匹配除换行符\n外的所有字符,使用这一选项以后,点号就能匹配包括换行符的任何字符。

  • re.U(re.UNICODE): 根据Unicode字符集解析字符

  • re.X(re.VERBOSE): 详细模式

# 这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")# 但是在这个模式下,如果你想匹配一个空格,你必须用&#39;/ &#39;的形式(&#39;/&#39;后面跟一个空格)


以上是Python標準庫學習re模組的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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