匹配字串中的/**,對比以下三種用法。
import re
s = 'justfortesting/**csdopov**/python'
# 第一種方式
re.findall('/\\*\\*',s)
[out]: ['/**']
# 第二種方式
re.findall(r'/\*\*',s)
[out]: ['/**']
# 第三種方式
pattern = re.escape('/**')
re.findall(pattern,s)
[out]: ['/**']
以上三種用法實際上是等價的,但是前兩者用法的正確使用的前提是正確的知道字串轉義和正則轉義的知識,而第三種用法則直接使用正規表示式的re.escap(str)函式,這樣只要我們傳入想要匹配的str引數,該函式就可以返回正確的字串轉義前和正則轉義前的字串。這裡的str內容是我們想要匹配的字串轉義前的字串(即並非字面的,而是在字串轉義語境下的),比如輸入str為'\n',則是字串轉義語境下的換行符,而不是字面的\和n。為了更深入的了解escape函式的設計機制,我們看如下例子。
import re
# 第一種方式
pattern = re.escape('\n') # 這時如果在互動視窗下輸入pattern回車檢視其內容,那麼顯示的是
# 轉義前(字串轉義和正則轉義)字串'\\\n'
re.findall(pattern,'\n')
[out]: ['\n']
# 第二種方式
re.findall('\\\n','\n')
[out]: ['\n']
# 第三種方式
re.findall('\\n','\n')
[out]: ['\n']
以上三種方式中,第一種和第二種是等價的,因為pattern實際上就是'\\\n',但是我們發現第三種方式也是可以匹配到換行符的。這是因為正則語法的\n也表示換行符,即相容字串中的換行符。但是escape函式的設計是對於所有的字串的,所以對於不相容的字元,其也要保證正確性,因此如果str是特殊字元,那麼對於正則來說,需要在其前面加入轉義符\將其轉為字串意義下的字元,所以再回溯到字串轉義,正則中\的成功加入需要在轉義前字串中加入\\,因此對於特殊字元,escape函式都會在其前面多出兩個轉義符。更簡單一點的比如re.escape('*'),返回的就是'\\*'。
綜上我們知道,對於正規表示式中的字串轉義和正則轉義之間,是具有不太容易一下子搞清楚的關係的,所以如果不想理解這層關係,又保證正確的使用正則匹配,規範的用法是使用escape函式進行匹配字元到轉義前字元的轉化,然後再將得到的轉義前字元作為引數傳給匹配函式。由於escape函式返回的是轉義前字串,因此再將其結合原生字串一起使用,是正則匹配最為規範的用法,如下所示,compile函式中對於正規表示式使用原生字串,並且字串的格式化表達中傳入的字串也是用escape函式返回的字串,即轉義前字串搭配轉義前字串,這是最為正確的組合,也是python正則匹配中最為推薦的規範用法。
import re
def process(start,end,f):
start = re.escape(start)
end = re.escape(end)
pattern = re.compile(r'%s(?:.|\s)*?%s'%(start,end))
s = f.read()
updated = ''.join(re.split(pattern,s))
return updated
正規表示式規範
來自 wiki 歷史 正規表示式的posix規範,分為 基本型正規表示式 basic regular expression,bre 和擴充套件型正規表示式 extended regular express,ere 兩大流派。在相容posix的unix系統上,grep和egrep之類的工具都遵循pos...
python正規表示式及使用正規表示式的例子
正規表示式 正則表達用來匹配字串 正規表示式匹配過程 正規表示式語法規則 匹配除換行 n 外的任意字串 abcabc 轉義字元,使後乙個字元改變原來的意思 a c a c 字符集,對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如 abc 或 a c 第乙個字元如果是 ...
Python正規表示式使用
python正規表示式使用 正規表示式不是python內建的功能,所以需要引入import re模組才可以使用。正規表示式的功能很多,但是我們通常使用的功能也就是那幾個,這裡對工作中經常使用到的正規表示式進行乙個系統的總結。1.字元 匹配除了換行符 n 外的字元 轉義字元,使後乙個字元改變以前的意思...