如何在Python正則表示式中轉義任何特殊字元?


正則表示式,通常稱為regexp,是查詢和操作文字字串的強大工具,尤其是在處理文字檔案時。正則表示式可以輕鬆地用一行程式碼替換數百行計算機程式碼。

所有指令碼語言,包括Perl、Python、PHP、JavaScript、通用程式語言(如Java),甚至文字處理器(如Word),都支援用於文字搜尋的正則表示式。正則表示式可能因其複雜的語法而難以學習,但這是值得的。

特殊字元

當包含特殊字元時,文字處理變得更具挑戰性,因為必須仔細考慮上下文。在檢視使用正則表示式的Python程式碼時,您必須考慮您看到的內容、Python看到的內容以及正則表示式引擎看到的內容。Python可能認為某個字元是唯一的,而正則表示式可能不是,反之亦然。

本文介紹了在各種情況下處理特殊字元的具體示例。

繞過某些TeX字元

我們最近需要一個正則表示式來轉義TeX的特殊字元。為了讓TeX將下劃線識別為字面下劃線和下標命令,我們需要將像ICD9 CODE這樣的文字轉換為ICD9 CODE。

TeX比下劃線有更多特殊字元。它有10個特殊字元:

\ { } $ & # ^ _% ~

由於它們在日常語言中無處不在,美元符號 ($) 和百分號 (%) 可能是人們最容易出錯的兩個字元。匯入百分號而不對其進行轉義將會靜默失敗,因為在TeX中,%表示註釋的開始。結果在語法上是正確的。簡單地說,它結束了句子的其餘部分。

正則表示式的反斜槓 (\) 表示以下之一:

  • 根據下一節中的表格,跟隨它的字元是文字字元。例如,符號 \b、\t 和 \x020 分別表示正則表示式匹配應該從單詞邊界、製表符和空格開始。

  • 任何其他會被理解為語言結構的字元都應該被視為字面意思。例如,量詞的定義以花括號 {} 開頭,但如果後面跟著反斜槓 \,則正則表示式引擎應該匹配花括號 {}。類似地,反斜槓 \ 表示轉義語言結構的開始,但兩個反斜槓 \\ 表示正則表示式引擎應該匹配反斜槓。

原始字串

在這種情況下發生了一些有趣的事情。大多數TeX特定字元不是Python特定字元。但是,反斜槓對於兩者都是特殊的。正則表示式對反斜槓也有特殊情況。在引號之前的 r 字首告訴Python這是一個“原始”字串,並且反斜槓不應該被特殊對待。它表示需要一個以兩個反斜槓開頭的字串。

為什麼要使用兩個反斜槓?為什麼不只用一個?反斜槓在正則表示式中是特殊的,我們將在其中使用這個字串。稍後會詳細介紹。

解決方案

對於正則表示式模式,答案是使用Python的原始字串表示法;在以“r”為字首的字串字面量中,反斜槓不會被特殊對待。因此,“r\\n”是一個由字元“\\”和“n”組成的兩個字元的字串,而“\n”是一個包含換行符的一個字元的字串。這種原始字串表示法通常用於Python程式中來表示模式。

語法

line = r"\String"

r”\String” 將句子讀取為原始字串,而 “\\r” 是回車符。

示例 1

#importing re
import re
#using escape method to escape special character
re. (r'\ a.*$')
'\\ a\.\*\$'
#printing the escaped character
print(re.escape(r'\ a.*$'))

輸出

\ a\.\*\$

示例 2

#importing re
import re
#using escape method to escape special character
re.escape('www.stackoverflow.com')
'www\.stackoverflow\.com'
#printing the escaped character
print(re.escape('www.stackoverflow.com'))

輸出

www\.stackoverflow\.com

程式碼解釋

  • 我們向後看表示式的複雜性在於,我們正在尋找一個特殊字元。我們正在尋找的是反斜槓,對於正則表示式來說是一個特殊字元。

  • 在確保沒有反斜槓並在後面檢查一個反斜槓後,我們搜尋我們的特殊字元。為了讓正則表示式引擎識別兩個反斜槓並將它們解釋為一個字面反斜槓,我們在宣告變數 special 時使用了兩個反斜槓。

  • 我們希望指示 re.sub 在第一個捕獲組之前新增一個反斜槓。我們傳遞 \\ 來表示一個字面反斜槓,因為正則表示式引擎對反斜槓的處理方式不同。當我們用 \1 來表示第一個捕獲組時,結果與之前相同。

結論

反斜槓 (\) 在正則表示式中具有雙重作用:對於元字元,如 \d(數字)、\D(非數字)、\s(空格)、\S(非空格)、\w(單詞)和 \W(非單詞)。為了避免使用特殊的正則表示式字元,例如 . 用於 .、+ 用於 +、* 用於 * 和 ? 用於 ?。在正則表示式中,您還需要使用 \\ 來避免歧義。此外,正則表示式理解 \n 表示換行符,\t 表示製表符等等。請注意,反斜槓字元 (\) 也用於Python字串中的轉義序列。例如,“\n”表示換行符,“\t”表示製表符,您還需要編寫 “\\” 來表示 \。因此,在這些語言中,您必須編寫 “\\\\”(兩層轉義!!!)來編寫正則表示式模式(它匹配一個 \)。等價於正則表示式元字元 \d 的是 “\\d”。

更新於:2023年4月4日

2K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.