如何在 Python 正则表达式中转义任何特殊字符?
正则表达式,通常称为 regexp,是查找和操作文本字符串的强大工具,尤其是在处理文本文件时。正则表达式可以轻松地用一行代码替换数百行计算机代码。
所有脚本语言,包括 Perl、Python、PHP、JavaScript、通用编程语言(如 Java),甚至像 Word 这样的文字处理器,都支持用于文本搜索的正则表达式。正则表达式由于其复杂的语法而可能难以学习,但这是值得花费的时间。
特殊字符
当包含特殊字符时,文本处理变得更具挑战性,因为必须仔细考虑上下文。在查看使用正则表达式的 Python 代码时,您必须考虑您看到的内容、Python 看到的内容以及正则表达式引擎看到的内容。Python 可能认为某个字符是唯一的,而正则表达式可能不认为是唯一的,反之亦然。
本文介绍了在各种情况下处理特殊字符的具体示例。
绕过某些 TeX 字符
我们最近需要一个正则表达式来转义 TeX 的特殊字符。为了让 TeX 将下划线识别为文字下划线和下标命令,我们需要将类似 ICD9 CODE 的文本转换为 ICD9 CODE。
TeX 比下划线有更多值得记忆的字符。它有 10 个特殊字符 -
\ { } $ & # ^ _% ~
由于它们在日常语言中无处不在,$ 和 % 可能是人们最常遇到的两个字符。导入百分号而不转义它会导致静默失败,因为在 TeX 中,% 表示注释的开始。结果在语法上是正确的。简单地说,它结束了句子的其余部分。
正则表达式中的反斜杠 () 表示以下之一 -
根据下一节中的表格,它后面的字符是唯一的。例如,符号 b、t 和 x020 分别表示正则表达式匹配应从单词边界、制表符和空格开始。
任何原本会被理解为语言结构的字符都应该按字面意思理解。例如,量词的定义以大括号 () 开头,但如果后面跟着反斜杠 (),则正则表达式引擎应该匹配大括号。同样,反斜杠 (/) 表示转义语言结构的开始,但两个反斜杠 () 表示正则表达式引擎应该匹配反斜杠。
Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.
原始字符串
在这种情况下正在发生一些有趣的事情。大多数 TeX 特定字符不是 Python 特定的。但是,反斜杠对两者都是唯一的。正则表达式对反斜杠也有特殊情况。Python 通过引号前面的 r 前缀被告知这是一个“原始”字符串,并且反斜杠不应该被区别对待。它表示希望一个以两个反斜杠开头的字符串。
为什么要使用两个反斜杠?为什么不只这样做?反斜杠在正则表达式中是特殊的,这就是我们将使用此字符串的地方。很快,更多关于它。
解决方案
对于正则表达式模式,答案是使用 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 表示初始捕获来跟随它时,结果与之前相同。
结论
反斜杠 () 在 Regex 中有两个作用:在元字符(如 d(数字)、D(非数字)、s(空格)、S(非空格)、w(单词)和 W(非单词))的情况下。为了避免使用特殊正则表达式字符,例如 . 用于 .、+ 用于 +、* 用于 * 和 ? 用于 ?。在正则表达式中,您还必须使用单词“for”来防止歧义。此外,Regex 将 n 解释为换行符,t 解释为制表符,等等。请注意,反斜杠字符 () 也用于 Python 中字符串的转义序列。例如,“\n”表示换行符,“\t”表示制表符,您还必须为 \ 编写“” 。因此,在这些语言中,您必须编写“” (两级转义!!!)来编写正则表达式模式(它匹配一个)。等价于正则表达式元字符 \d 的“\d”。