如何在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”。