re模組提供了一系列功能強大的正規表示式(regular expression)工具,它們允許你快速檢查給定字串是否與給定的模式匹配( match函數), 或包含這個模式(search函數)。正規表示式是以緊湊(也很神秘)的語法寫出的字串模式。
常用方法 | #描述 |
---|---|
string, flags=0) | 如果字串string的開頭和正規表示式pattern符合傳回對應的MatchObject的實例,否則傳回None |
#掃描string,如果有個位置可以符合正規表示式pattern,就傳回一個MatchObject的實例,否則返回None | |
count=0, flags=0) | 將string裡配對pattern的部分,用repl替換掉,最多替換count次|
和sub類似,subn回傳的是一個替換後的字串和匹配次 | 數組成的元組 |
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中除了字母和數字以外的字符,都加上反斜桿 |
語法 | 說明 |
---|---|
. | 匹配除了換行符號外的任何字元 |
^ | 頭匹配 |
$ | 尾匹配 |
* | 匹配前一個字元0次或多次 |
+ | |
? | |
######### #{m,n} | 符合前一個字元m至n次 |
\ | 對任一特殊字元進行轉義 |
#[] | 用來表示一個字元集合 |
| | #或,代表左右任意匹配一個 |
從字串的開始匹配,如果pattern匹配到就返回一個Match物件實例(Match物件在後面描述),否則放回None。 flags為匹配模式(會在下面描述),用來控制正規表示式的匹配方式。
import re a = 'abcdefg'print re.match(r'abc', a) # 匹配成功print re.match(r'abc', a).group()print re.match(r'cde', a) # 匹配失败>>><_sre.SRE_Match object at 0x0000000001D94578> >>>abc >>>None
用於尋找字串中可以符合成功的子字串,如果找到就傳回一個Match物件實例,否則傳回None。
import re a = 'abcdefg'print re.search(r'bc', a)print re.search(r'bc', a).group()print re.search(r'123', a) >>><_sre.SRE_Match object at 0x0000000001D94578> >>>bc >>>None
替換,將string裡匹配pattern的部分,用repl替換掉,最多替換count次(剩餘的匹配將不做處理),然後傳回替換後的字串。
import re a = 'a1b2c3'print re.sub(r'\d+', '0', a) # 将数字替换成'0'print re.sub(r'\s+', '0', a) # 将空白字符替换成'0'>>>a0b0c0 >>>a1b2c3
跟sub()函數一樣,只是它回傳的是一個元組,包含新字串和配對到的次數
import re a = 'a1b2c3'print re.subn(r'\d+', '0', a) # 将数字替换成'0'>>>('a0b0c0', 3)
正規版的split(),用符合pattern的子字串來分割string,如果pattern裡面使用了圓括號,那麼被pattern符合的字串也會作為傳回值清單的一部分,maxsplit為最多被分割的字串。
import re a = 'a1b1c'print re.split(r'\d', a)print re.split(r'(\d)', a) >>>['a', 'b', 'c'] >>>['a', '1', 'b', '1', 'c']
# 以列表的形式傳回string裡符合pattern的不重疊的子字串。
import re a = 'a1b2c3d4'print re.findall('\d', a) >>>['1', '2', '3', '4']
re.match()、re.search()成功匹配的話都會返回一個Match對象,它包含了很多此次匹配的信息,可以使用Match提供的屬性或方法來取得這些資訊。例如:
>>>import re >>>str = 'he has 2 books and 1 pen' >>>ob = re.search('(\d+)', str) >>>print ob.string # 匹配时使用的文本 he has 2 books and 1 pen >>>print ob.re # 匹配时使用的Pattern对象 re.compile(r'(\d+)') >>>print ob.group() # 获得一个或多个分组截获的字符串 2 >>>print ob.groups() # 以元组形式返回全部分组截获的字符串 ('2',)
Pattern物件物件由re.compile()傳回,它帶有許多re模組的同名方法,而且方法作用類似一樣的。例如:
>>>import re >>>pa = re.compile('(d\+)') >>>print pa.split('he has 2 books and 1 pen') ['he has ', '2', ' books and ', '1', ' pen'] >>>print pa.findall('he has 2 books and 1 pen') ['2', '1'] >>>print pa.sub('much', 'he has 2 books and 1 pen') he has much books and much pen
匹配模式取值可以使用位元或運算子'|'表示同時生效,例如re.I | re. M, 下面是常見的一些flag。
re.I(re.IGNORECASE): 忽略大小寫
>>>pa = re.compile('abc', re.I) >>>pa.findall('AbCdEfG') >>>['AbC']
re.L(re.LOCALE ):字元集本地化
這個功能是為了支援多語言版本的字元集使用環境的,例如在轉義符\w
,在英文環境下,它代表[a-zA-Z0-9]
,即所以英文字元和數字。如果在一個法語環境下使用,有些法語字串便匹配不上。加上這L選項和就可以配對了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字元。
re.M(re.MULTILINE): 多行模式,改變'^'與'$'的行為
>>>pa = re.compile('^\d+') >>>pa.findall('123 456\n789 012\n345 678') >>>['123'] >>>pa_m = re.compile('^\d+', re.M) >>>pa_m.findall('123 456\n789 012\n345 678') >>>['123', '789', '345']
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*")# 但是在这个模式下,如果你想匹配一个空格,你必须用'/ '的形式('/'后面跟一个空格)
以上是Python標準庫學習re模組的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!