python正規表示式轉義注意事項

2021-09-25 13:03:47 字數 2851 閱讀 2796

無論哪種語言,在使用正規表示式的時候都避免不了乙個問題,就是在匹配元字元的時候,需要對元字元進行轉義,讓

正規表示式引擎將其當做普通字元來匹配。本文主要以python為例,說明一下轉義中需要注意的問題。

python的正規表示式中需要轉義的元字元有以下幾個:^$

*+?\\

|{}()python中對元字元的轉義使用雙反斜槓 \\ 來表示

# 普通元字元的轉義

_string = '''

!@#$%^&

'''# 不轉義

print re.findall('$', _string)

#>>> ['', '']

# 雙反斜槓轉義

print re.findall('\\$', _string)

#>>> ['$']

# 單反斜槓轉義

print re.findall('\$', _string)

#>>> ['$']

看上面的例子大家可能會發現,使用乙個反斜槓 \ 也可以達到轉義的效果,那為什麼還要寫兩個呢?這得先搞清楚python的字串轉義(不是正規表示式轉義),python本身使用 \ 來轉義一些特殊字元,比如在字串中加入引號的時候,為了

s = 'i\'m superman'

print s

#>>> i'm superman

防止和字串本身的引號衝突,使用 \ 來轉義,一般情況下這個也不會引起什麼問題,但是當你要使用 \ 來轉義 \ 的時候,就比較混亂了,比如我們想要輸出乙個 \ ,得寫兩個 \ ,否則會報語法錯誤,因為 \ 把後面的引號給轉義了,必須使用 \ 

# 錯誤寫法

# print '\'

# 正確寫法

print '\\'

#>>> \

# 原生字串

print r'\\'

#>>> \\

將 \ 轉義一下使其不具備轉義功能,才可以正確輸出,當使用原生字串的時候,輸出顯示了兩個 \ ,看起來好像是寫幾個輸出幾個的樣子,如果這樣想的話,你可以試一下,看能不能輸出奇數個 \。

先來說一下什麼是原生字串,其實就是不進行特殊處理的字串,所謂特殊處理,貌似就是針對轉義的,原生字串的誕生本身就是為了解決轉義的時候寫了太多 \ 的問題,但是為什麼使用了原生字串仍然不能只輸出乙個 \ 呢?其實這應該算是乙個bug,就是python的字串不能以奇數個 \ 結尾,這樣的寫法會被認為是將結尾的引號進行了轉義,導致語法錯誤。具體可以參考

雖然原生字串並不是很完美,但它已經可以幫我們解決很大一部分問題了。比如當你想匹配 \ 的時候,原生字串可

_string = '\\\\'

print _string

#>>> \\

# 字串

for i in re.findall('\\\\', _string):

print i

#>>> \

#>>> \

# 原生字串

for i in re.findall(r'\\', _string):

print i

#>>> \

#>>> \

以讓你少寫一半的 \ ,既節省**量,又增加可讀性。

說了這麼多也沒說為什麼在寫正規表示式的時候乙個 \ 也可以起到轉義的作用。我們先來分析一下乙個字串被正則表

達式引擎解析的過程,一共有4步:

首先正規表示式是乙個python的字串

字串本身會先進行轉義處理

正規表示式引擎得到處理之後的字串後再對字串進行正規表示式引擎自己的處理

開始匹配

# 字串

# '\\\\'

# 經過python處理之後

# '\\'

# 正規表示式引擎接收到的

# '\\'

# 正規表示式引擎進行轉義處理後 可以匹配到 \

# '\'

而當使用原生字串的時候就變為了3步:

# 原生

# '\\'

# 不再處理

# '\\'

# 正規表示式引擎接收到的

# '\\'

# 正規表示式引擎進行轉義處理

# '\'

下面是最重要的乙個,當使用乙個 \ 轉義的時候,python會識別不了轉義序列,於是它就不做任何處理,直接傳給了正規表示式引擎。這就解釋了為什麼乙個 \也可以轉義。這個不算bug,雖然方便了使用,但會讓人很迷惑,有利有弊吧。

# 原生

# '\$'

# 識別不了 不進行處理

# '\$'

# 正規表示式引擎接收到的

# '\$'

# 正規表示式引擎進行轉義處理

# '$'

下面舉幾個例子看一下:

# 匹配 \d+

_string = 'i am \d+'

print re.findall('\\\\d\\+', _string)[0]

#>>> \d+

print re.findall(r'\\d\+', _string)[0]

#>>> \d+

# 匹配

_string = 'i am '

print re.findall('\\[\\]', _string)[0]

#>>>

print re.findall('\[\]', _string)[0]

#>>>

print re.findall(r'\[\]', _string)[0]

#>>>

正規表示式轉義

除 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個...