Python正規表示式中轉義字元用法小結

2021-09-24 23:00:12 字數 3677 閱讀 1657

最近在學習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個...