Python:筆記(6)——正則表達式

Python:筆記(6)——正則表達式

re模塊

  re模塊用於在字符串中執行基於正則表達式模式的匹配和替換python

使用原始字符串

  正則表達式使用 \ 對特殊字符進行轉義,好比,爲了匹配字符串 ‘python.org’,咱們須要使用正則表達式 'python\.org'。正則表達式

  可是Python 的字符串自己也用 \ 轉義,因此上面的正則表達式在 Python 中應該寫成 'python\\.org',這會很容易陷入 \ 的困擾中,所以,咱們建議使用 Python 的原始字符串,只需加一個 r 前綴,上面的正則表達式能夠寫成:函數

r'python\.org'

關於中文的匹配

   正則匹配中文,固定形式:[\u4E00-\u9FA5]+。post

import re
str = 'posted @ 2018-11-03 15:00 MrSaber 閱讀(82) 評論(0)'
pattern = re.compile(r'[\u4E00-\u9FA5]+\((\d+)\)');
m = pattern.findall(str)
print(m)

re模塊的使用步驟

  • 使用 compile 函數將正則表達式的字符串形式編譯爲一個 Pattern 對象
  • 經過 Pattern 對象提供的一系列方法對文本進行匹配查找,得到匹配結果(一個 Match 對象)
  • 最後使用 Match 對象提供的屬性和方法得到信息,根據須要進行其餘的操做

 

編譯Pattern對象

  compile 函數用於編譯正則表達式,生成一個 Pattern 對象,它的通常使用形式以下:spa

re.compile(pattern[, flag])

  其中,pattern 是一個字符串形式的正則表達式,flag 是一個可選參數,表示匹配模式,好比忽略大小寫,多行模式等。code

import re
# 將正則表達式編譯成 Pattern 對象 
pattern = re.compile(r'\d+')

  在上面,咱們已將一個正則表達式編譯成 Pattern 對象,接下來,咱們就能夠利用 pattern 的一系列方法對文本進行匹配查找了。Pattern 對象的一些經常使用方法主要有:對象

  • match 方法
  • search 方法
  • findall 方法
  • finditer 方法
  • split 方法
  • sub 方法
  • subn 方法

 

匹配

  咱們主要討論一下四個匹配方法的區別。blog

match(pattern,string,[,flags])

  檢查String的開頭是否有字符與pattern匹配。若是成功,返回一個MatchObject,不然返回None。字符串

search(pattern,string,[,flags])

  在String中搜索pattern的第一個匹配值。若是成功,返回一個MatchObject,不然返回None。string

  如下面代碼爲例,咱們想匹配閱讀數,可是閱讀不是str的開頭,因此match匹配失敗。

import re
str = 'posted @ 2018-11-03 15:00 MrSaber 閱讀(82) 評論(0)'
pattern = re.compile(r'閱讀\((\d+)\)');
m1 = pattern.search(str)
m2 = pattern.match(str)
print(m1) # 閱讀(82)
print(m2) # None

findall(pattern,string,[,flags])

  返回String中與pattern匹配的全部未重疊的值,包括空匹配值。若是模式包含分組,將返回與分組匹配的文本列表。若是使用了不止一個分組,那麼列表中的每項都是一個元組,包含每一個分組的文本。

finditer(pattern,string,[,flags])

  與findall方法含義相同,可是返回的是一個迭代器對象。迭代器的返回類型是MatchObject的項。

 

分組

  除了簡單地判斷是否匹配以外,正則表達式還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。好比:

  ^(\d{3})-(\d{3,8})$分別定義了兩個組,能夠直接從匹配的字符串中提取出區號和本地號碼:

>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
相關文章
相關標籤/搜索