Python內建模組之 re庫

ckxllf發表於2021-03-17

  十三、Python內建模組之 re庫,介紹正規表示式初階用法

  13.1 re 庫的應用

  re 庫是 Python 中處理正規表示式的標準庫,本篇部落格介紹 re 庫的同時,會簡單介紹一下正規表示式語法,如果想深入學習正規表示式,還需要好好下一番功夫。

  13.1.1 正規表示式語法

  正規表示式語法由字元和運算子構成,初期階段掌握下述這些內容即可。

  運算子說明例子

  .任何單個字元,極少不能匹配

  []字符集,對單個字元給出取值範圍[abc] 表示匹配 a、b、c,[a-z] 表示 a 到 z 單個字元

  [^]非字符集,對單個字元給出排除範圍[^abc] 表示匹配 非 a、非 b、非 c 的單個字元

  *前一個字元 0 次或無限次擴充套件abc* 表示 ab、abc、abcc、abccc 等

  +前一個字元 1 次或無限次擴充套件abc+ 表示 abc、abcc、abccc 等

  ?前一個字元 0 次或 1 次abc? 表示 ab、abc

  |左右表示式任意一個abc|def 表示 abc 或者 def

  {m}擴充套件前 1 個字元 m 次ab{2}c,表示 abbc

  {m,n}擴充套件前 1 個字元 m 到 n 次ab{1,2}c,表示 abc、abbc

  ^匹配字串開頭^abc 表示 abc 在字串開頭

  $匹配字串結尾abc$ 表示 abc 在字串結尾

  ()分組標記,內部僅能使用 | 運算子(abc) 表示 abc,(a

  \d數字,等價於 [0-9]

  \w字元,等價於 [A-Za-z0-9]

  以上表示僅僅為正則表達最基礎部分內容,如果希望深入研究正規表示式,建議尋找更加全面的資料進行學習,本文只做藥引。

  13.1.2 re 庫基本用法

  re 庫主要函式如下:

  基礎函式:compile;

  功能函式:search、match、findall、split、finditer、sub。

  在正式學習之前,先了解一下原生字串。

  在 Python 中,表示原生字串,需要在字串前面加上 r。

  例如 my_str = 'i'am xiangpica' 在程式中會直接報錯,如果希望字串中 ' 可以正常執行,需要加上轉移字元 \,修改為 my_str = 'i\'am xiangpica'。

  但這樣結合上文正規表示式中的運算子,就會出現問題,因為 \ 在正規表示式中是有真實含義的,如果你使用 re 庫去匹配字串中的 \,那需要使用 4 個反斜槓,為了避免這種情況出現,引入了原生字串概念。

  # 不使用原生字串的正規表示式 "\\\\"

  # 使用原生字串的正規表示式 r"\\"

  在後文會有實際的應用。

  接下來在學習一個案例,例如下述程式碼:

  my_str='C:\number'

  print(my_str)

  C:

  umber

  本段程式碼的輸出效果如下,\n 被解析成了換行,如果想要遮蔽這種現象,使用 r 即可:

  my_str=r'C:\number'

  print(my_str)

  輸出 C:\number。

  13.2 re 庫相關函式說明

  13.2.1 re.search 函式

  該函式用於,在字串中搜尋正規表示式匹配到的第一個位置的值,返回 match 物件。

  函式原型如下:

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

  需求:在字串 夢想橡皮擦 good good 中匹配 橡皮擦。

  import re

  my_str='夢想橡皮擦 good good'

  pattern = r'橡皮擦'

  ret = re.search(pattern,my_str)

  print(ret)

  返回結果:。

  search 函式的第三個引數 flags 表示正規表示式使用時的控制標記。

  re.I,re.IGNORECASE:忽略正規表示式的大小寫;

  re.M,re.MULTILINE:正規表示式中的 ^ 運算子能夠將給定字串的每行當做匹配的開始;

  re.S,re.DOTALL:正規表示式中的 . 運算子能夠匹配所有字元。

  最後將匹配到的字串進行輸出,使用下述程式碼即可實現。

  import re

  my_str = '夢想橡皮擦 good good'

  pattern = r'橡皮擦'

  ret = re.search(pattern, my_str)

  if ret:

  print(ret.group(0))

  13.2.2 re.match 函式

  該函式用於在目標字串開始位置去匹配正規表示式,返回 match 物件,未匹配成功返回 None,函式原型如下:

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

  一定要注意是目標字串開始位置。

  import re

  my_str = '夢想橡皮擦 good good'

  pattern = r'夢' # 匹配到資料

  pattern = r'good' # 匹配不到資料

  ret = re.match(pattern, my_str)

  if ret:

  print(ret.group(0))

  re.match 和 re.search 方法都是一次最多返回一個匹配物件,如果希望返回多個值,可以透過在 pattern 里加括號構造匹配組返回多個字串。

  13.2.3 re.findall 函式

  該函式用於搜尋字串,以列表格式返回全部匹配到的字串,函式原型如下:

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

  測試程式碼如下:

  import re

  my_str = '夢想橡皮擦 good good'

  pattern = r'good'

  ret = re.findall(pattern, my_str)

  print(ret)

  13.2.4 re.split 函式

  該函式將一個字串按照正規表示式匹配結果進行分割,返回一個列表。

  函式原型如下:

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

  re.split 函式進行分割的時候,如果正規表示式匹配到的字元恰好在字串開頭或者結尾,返回分割後的字串列表首尾都多了空格,需要手動去除,例如下述程式碼:

  import re

  my_str = '1夢想橡皮擦1good1good1'

  pattern = r'\d'

  ret = re.split(pattern, my_str)

  print(ret)

  執行結果:

  ['', '夢想橡皮擦', 'good', 'good', '']

  切換為中間的內容,則能正確的分割字串。

  import re

  my_str = '1夢想橡皮擦1good1good1'

  pattern = r'good'

  ret = re.split(pattern, my_str)

  print(ret)

  如果在 pattern 中捕獲到括號,那括號中匹配到的結果也會在返回的列表中。

  import re

  my_str = '1夢想橡皮擦1good1good1'

  pattern = r'(good)'

  ret = re.split(pattern, my_str)

  print(ret)

  執行結果,你可以對比帶括號和不帶括號的區別進行學習:

  ['1夢想橡皮擦1', 'good', '1', 'good', '1']

  maxsplit 參數列示最多進行分割次數, 剩下的字元全部返回到列表的最後一個元素,例如設定匹配 1 次,得到的結果是 ['1夢想橡皮擦1', '1good1']。

  13.2.5 re.finditer 函式

  搜尋字串,並返回一個匹配結果的迭代器,每個迭代元素都是 match 物件。函式原型如下:

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

  測試程式碼如下:

  import re 大連婦科醫院哪家好

  my_str = '1夢想橡皮擦1good1good1'

  pattern = r'good'

  # ret = re.split(pattern, my_str,maxsplit=1)

  ret =re.finditer(pattern, my_str)

  print(ret)

  13.2.6 re.sub 函式

  在一個字串中替換被正規表示式匹配到的字串,返回替換後的字串,函式原型如下:

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

  其中 repl 引數是替換匹配字串的字串,count 引數是匹配的最大替換次數。

  import re

  my_str = '1夢想橡皮擦1good1good1'

  pattern = r'good'

  ret = re.sub(pattern, "nice", my_str)

  print(ret)

  執行之後,得到替換之後的字串:

  1夢想橡皮擦1nice1nice1

  13.2.7 re 庫其它函式

  其它比較常見的函式有:re.fullmatch(),re.subn(),re.escape(),更多內容可以查閱 官方文件,獲取一手資料。

  13.3 re 庫的物件導向寫法

  上文都是函式式寫法,re 庫可以採用物件導向的寫法,將正規表示式進行編譯之後,多次操作。核心用到的函式是 re.compile。

  該函式原型如下:

  regex = re.compile(pattern,flags=0)

  其中 pattern 是正規表示式字串或者原生字串。

  測試程式碼如下:

  import re

  my_str = '1夢想橡皮擦1good1good1'

  # 正則物件

  regex = re.compile(pattern = r'good')

  ret = regex.sub("nice", my_str)

  print(ret)

  上述程式碼將正規表示式編譯為一個正則物件,後面在 regex.sub 函式中就不需要在寫正規表示式了,使用時,只需要將編譯好的 regex 物件替換所有的 re 物件,再去呼叫對應的方法。

  13.4 re 庫的 match 物件

  使用 re 庫匹配字串之後,會返回 match 物件,該物件具備以下屬性和方法。

  13.4.1 match 物件的屬性

  .string:待匹配的文字;

  .re:匹配時使用的 pattern 物件;

  .pos:正規表示式搜尋文字的開始位置;

  .endpos:正規表示式搜尋文字的結束位置。

  測試程式碼如下:

  import re

  my_str = '1夢想橡皮擦1good1good1'

  regex = re.compile(pattern = r'g\w+d')

  ret = regex.search(my_str)

  print(ret)

  print(ret.string)

  print(ret.re)

  print(ret.pos)

  print(ret.endpos)

  結果輸出:

  1夢想橡皮擦1good1good1

  re.compile('g\\w+d')

  0

  17

  13.4.2 match 物件的方法

  .group(0):獲取匹配後的字串;

  .start():匹配字串在原始字串的開始位置;

  .end():匹配字串在原始字串的結尾位置;

  .span():返回(.start(),.end())

  因為內容比較簡單,具體程式碼不再展示。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2763358/,如需轉載,請註明出處,否則將追究法律責任。

相關文章