Python運維基礎(4)正則表達式

正則表達式

正則表達式簡介

正則表達式描述了一種字符串匹配的模式(pattern),是處理字符串的強大工具(效率上不如字符串自帶的方法),擁有自己獨特的語法以及獨立的處理引擎:可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

正則表達式匹配的大致過程如下:
依次將表達式中的字符與文本內容進行比對,如果每一個字符都能匹配上,則匹配成功,否則匹配失敗。

簡單實例

  • ^[0-9]+abc$
  • ^爲匹配字符串的開始位置
  • [0-9]+匹配多個數字,[0-9]匹配單個數字
  • abc匹配字母abc並以abc結尾,$爲匹配輸入字符串的結束位置

爲什麼使用正則表達式?
普通的搜索和替換方法可以滿足對靜態文本的簡單操作,但它缺乏靈活性,如果採用這種方法搜索動態文本,就會變得非常困難。

正則表達式的語法

正則表達式是有普通字符(a到z)以及特殊字符(稱爲元字符)組成的文字模式。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。
例如:
- runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 號代表前面的字符必須至少出現一次(1次或多次)。
- runoo*b,可以匹配 runob、runoob、runoooooob 等,* 號代表字符可以不出現,也可以出現一次或者多次(0次、或1次、或多次)。
- colou?r 可以匹配 color 或者 colour,? 問號代表前面的字符最多隻可以出現一次(0次、或1次)。

普通字符:包括所有大小寫字母,數字,標點以及一些其他符號。

非打印字符:換頁符(\f),換行符(\n),回車符(\r)等等

特殊字符:有一些特殊含義的字符,若要匹配這些字符,必須先對這些字符進行轉義

這裏寫圖片描述

限定符:
例如前面實例中的 * + ?等等。

*、+限定符都是貪婪的,因爲它們會盡可能多的匹配文字。
在它們的後面加上?可以實現非貪婪或最小匹配

定位符:
定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結束,\b 描述單詞的前或後邊界,\B 表示非單詞邊界。

python正則表達式

正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符是否與某種模式匹配。
re模塊使得python語言擁有全部的正則表達式功能。

compile函數根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法可用於正則表達式的匹配和替換。多用於編譯正則表達式模式。

re.S : 匹配包括換行在內的所有字符
re.I : 使匹配對大小寫不敏感
re.L : 做本地化識別匹配,法語等
re.M : 多行匹配,影響^和$
re.X : 該標誌通過給予更靈活的格式以便將正則表達式寫得更易於理解
re.U : 根據Unicode字符集解析字符,這個標誌影響\w,\W,\b,\B

re模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做爲它們的第一個參數。


import re

(1)re.match函數:嘗試從字符串的起始位置匹配一個模式,如果不是在起始位置匹配成功,match()就返回None
(2)re.search方法:掃描整個字符串並返回第一個成功的匹配。匹配成功返回一個匹配對象,否則返回None,同樣,也可以使用group()或者groups()匹配對象函數來獲取匹配表達式。

re.search(pattern, string, flags)中,pattern表示匹配的正則表達式,string表示要匹配的字符串。

上述兩者的區別:

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。


eg : re.match()

import re
print(re.match('www', 'www.runoob.com').span())  
print(re.match('com', 'www.runoob.com'))

Output :
(0, 3) # 在字符串的開始就匹配成功
None # 在一開始沒能匹配成功


eg : re.search()

f = re.search('com', 'www.baidu.com').span()
print(f)
print(re.search('hahaha', 'www.baidu.com'))

Output :
(10, 13) # 掃描整個字符串並且成功匹配
None # 未找到匹配項

補充知識:

span():
用單個元組把開始和結束時的索引一起返回。如果re在字符串起始位置匹配,那麼 start() 將總是爲零,但是如果不是在起始位置匹配,則start()就不會是零了。


eg : group()

>>> m.group()
 'tempo'
>>> m.start(), m.end()
 (0, 5)
>>> m.span()
 (0, 5)

>>> print p.match('::: message')
 None
>>> m = p.search('::: message') ; print m
 <re.MatchObject instance at 80c9650>
>>> m.group()
 'message'
>>> m.span()
 (4, 11)

1. 匹配簡單字符:

  1. 將正則表達式編譯成Pattern對象
  2. 使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回None
1:
p = re.compile(r'hello')
m = p.match('hello, world')
print(m)
print(m.group())

法2:
pattern = re.match(r'zhu', 'zhukeyan')  # 前面的內容在後面是否可匹配到,注意默認只能匹配開頭的字符。
print(pattern.group())

re.match()前面參數表示匹配的正則表達式,後面的參數表示要匹配的字符串。
我們可以用group()或groups()匹配對象函數來獲取匹配表達式。

2. split()方法按照能夠匹配的字符將字符串分割後返回列表

p = re.compile(r'\d+')  # \d+表示匹配數字
r = p.split('one1two2three3four4')
print(r)

Output:[‘one’, ‘two’, ‘three’, ‘four’, ”]

將數字匹配出來,然後用匹配出來的數字對字符串進行分割。

3. findall():該方法能夠以列表的形式返回能匹配的字符串。

p = re.compile(r'\d+')
m = p.findall('one1two2three3four4')
print(m)

Output : [‘1’, ‘2’, ‘3’, ‘4’]

4. re.sub()函數進行以正則表達式爲基礎的替換。

f = re.sub('[abc]', 'o', 'Marc')
print(f)
# 'Marc'中匹配到a,c,然後用'o'來替換掉匹配到的內容。

Output : Moro

f = re.sub('[abc]', 'o', 'account', 1)
print(f)
# 後面的參數決定了只能替換一個

Output : occount

5. 正則表達式(圖片來自www.cnblogs.com/huxi)
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章