最近在學習python中的正規表示式,最開始對於匹配乙個數字字元可以用'\d'來進行匹配,在呼叫re.compile()方法時,可以呼叫re.compile(r'\d'),即使用原始字串傳入,或者re.compile('\\d')傳入(轉義以後就是'\d')。但是後來突然發現使用re.compile('\d')時,結果也是一樣的,接著就有了此文對轉義字元及其在正規表示式的使用的學習記錄。
所有的ascii碼都可以用「\」加數字(一般是8進製數字)來表示。而c中定義了一些字母前加"\"來表示常見的那些不能顯示的ascii字元,如\0,\t,\n等,就稱為轉義字元,因為後面的字元,都不是它本來的ascii字元意思了。下表給出了所有的轉義字元:
轉義字元
意義ascii碼值(十進位制)
\a響鈴(bel)
\b退格(bs) ,將當前位置移到前一列
\f換頁(ff),將當前位置移到下頁開頭
\n換行(lf) ,將當前位置移到下一行開頭
\r回車(cr) ,將當前位置移到本行開頭
\t水平製表(ht) (跳到下乙個tab位置)
\v垂直製表(vt)
代表乙個反斜線字元''\'
代表乙個單引號(撇號)字元
代表乙個雙引號字元
\?代表乙個問號
063\0
空字元(nul)
\ooo
1到3位八進位制數所代表的任意字元
三位八進位制
\xhh
十六進製製所代表的任意字元
十六進製制
注意:
1. 區分,斜槓:"/" 與 反斜槓:"\" ,此處不可互換
2. \xhh 十六進製制轉義不限制字元個數 '\x000000000000f' == '\xf' [3]
3、如果乙個'\'後出現乙個字元,且不是可以轉義的字元,那麼'\'及其後面的字元不會被轉義
如果乙個字串使用了r來進行標誌,那麼這個字串的所有字元字元將不會被轉義,保持原始的字元,如:
#a=r'\n' 相當於 a='\\n'
print(r'\n'=='\\n') #結果為true
#說明:
# r'\n'表示兩個字元('\'和'n')
# '\\n'也表示兩個字元,'\\'轉義後為'\',後面'n'不變
# 即轉義只會轉義一次
#a=r'\d' 相當於 a='\d'
print(r'\d'=='\d') #結果為true
#說明:
# \d不是轉義字元所以二者一樣
回歸最初始的問題,為什麼r'\d'和'\d'是一樣的現在就可以解釋了,因為二者就是表示的相同的字串,均為'\d'
那麼'\\d'呢?這麼來看,首先,在字串中'\\d'被解釋為'\d',然後再re.compile()中被解釋為數字的分類,所以r'\d','\d','\\d'在正規表示式中的意義是一樣的,這裡是\d不是轉義字元,下面我們對乙個轉義字元進行分析。
對於r'\n','\\n','\n'又是如何呢?r'\n'在字串中被解釋為兩個字元('\'和'n'),然後再re.compile()中又被解釋一次,故實際在正規表示式中的意義為《匹配乙個換行符》;'\\n'和r'\n'一樣,在字串中被解釋為兩個字元('\'和'n'),故在正規表示式中的意義也為《匹配乙個換行符》;對於'\n',在字串中的意義為'換行符',這個在re.compile()中不需要再被解釋,故也是《匹配乙個換行符的意思》
str1='123456\n123'
test1=re.compile(r'\n')
test2=re.compile('\\n')
test3=re.compile('\n')
print(test1.findall(str1),test2.findall(str1),test3.findall(str1))
#結果均可以匹配到換行符'\n'
上面的'\n'和'\d'在re.compile()中均可以被解釋,我們再看看乙個不可被解釋的字元,如r'\p','\\p','\p'的結果是怎樣的呢?結果均為報錯,因為r'\p','\\p','\p'在字串中的意思都是兩個字元('\'和'p'),'\p'接著在re.compile()中不可被解釋於是會報錯(這和字串中解釋有一定區別,字串中不能解釋就不會解釋)
①對於'\d',若需要不被解釋為《匹配數字》,則傳入re.compile()的字串s在經過解釋時不應該解釋為'\d',而應該是乙個'\'和乙個'd',這樣我們顯然想到如果s為'\\d',那麼s在re.compile()中就會被解釋為'\d'(不會再被解釋)。那麼我們這麼得到s呢?最簡單的方法就是用原始字串r'\\d'即表示'\\d',傳入即可。如果不使用原始字串,我們還可以使用'\\\d'和'\\\\d'來表示:'\\\d'中前兩個'\'在字串中被解釋為'\',而後面的'\d'不變;'\\\\d'中依次兩個'\'被解釋為乙個'\'故最終的結果也是'\\d',測試如下:
s='xx123\d456'
test1=re.compile(r'\\d')
test2=re.compile('\\\d')
test3=re.compile('\\\\d')
print(test1.findall(s),test2.findall(s),test3.findall(s))
#結果為['\\d'] ['\\d'] ['\\d']
#單個的'\'在字串中表示為'\\'
②對於'\n'的情況與上述情況有一定的區別,首先被匹配的字串裡面需要有'\n'《不被解釋為換行符》,這個我們可以用原始字串或者用'\\n'表示。接著,對於s=r'\\n'以及s='\\\\n'在傳入re.compile()以後的意義即'\\n',在re.compile()中被解釋為乙個'\'和乙個'n';而對於s='\\\n',在字串中前兩個'\'會被解釋為乙個'\',後面的'\n'被解釋為換行符,故在re.compile()中'\\\n'被解釋為乙個'\'和乙個換行符,測試如下:
s='xx123\\n456'
test1=re.compile(r'\\n')
test2=re.compile('\\\n')
test3=re.compile('\\\\n')
print(test1.findall(s),test2.findall(s),test3.findall(s))
#結果為['\\n'] ['\\n']
#單個的'\'在字串中表示為'\\'
#'\\\n'在字串的意義為'\'+《換行符》
# 但是'\'在re.compile()中又會對後面的《換行符》進行轉義--這裡存在疑問
# 但是re.compile('\\\n')最終能匹配的結果為《換行符》
#若要匹配到'\'+《換行符》,可以進行如下操作
s='xx123\\\n456'
#s中\\\n被解釋為'\'+《換行符》
test2=re.compile('\\\\\n')
#'\\\\\n'中的前四個'\'被解釋為'\\'
#接著'\\'在re.compile()被解釋為'\'
print(test2.findall(s))
#結果為['\\\n'],前面兩個'\'表示乙個'\',後面為乙個換行符'\n'
③如果要匹配'\p'的話,其分析過程銅'\d',不再進行具體的說明。
僅作學習的記錄,用詞以及內容難免有不規範與紕漏,歡迎討論與指正^_^
正規表示式轉義
除 d d 正確格式為 x x,x xx,x,xx,x,xx。驗證身份證號 15位或18位數字 d d 18 驗證一年的12個月 0?1 9 1 0 2 正確格式為 01 09 和 1 12 驗證乙個月的31天 0?1 9 1 2 0 9 30 31 正確格式為 01 09和1 31。整數 d 非負...
正規表示式 轉義
別字元 說明 匹配輸入字串的結尾位置。如果設定了 regexp 物件的 multiline 屬性,則 也匹配 n 或 r 要匹配 字元本身,請使用 標記乙個子表示式的開始和結束位置。子表示式可以獲取供以後使用。要匹配這些字元,請使用 和 匹配前面的子表示式零次或多次。要匹配 字元,請使用 匹配前面的...
正規表示式 貪婪匹配 轉義
preg match pa terr n,str 判斷是否匹配 preg replace pa tter n,replace,st r 將 符合的部 分替換為 replace,其中 內為一部分 此處占有乙個字元 匹配前面的 0個字元 匹配前面的 1個字元 匹配前面的0個或者1個字元 abc,匹配1個...