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。然而,反斜杠在两者中都是独特的。正则表达式也对反斜杠有一个特殊情况。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用于初始捕获时,结果与之前相同。
结论
在正则表达式中,反斜杠(\)具有两个功能:在元字符如d(数字)、D(非数字)、s(空格)、S(非空格)、w(单词)和W(非单词)的情况下。为了避免使用特殊的正则表达式符号,例如.代表.,+代表+,代表,?代表?,在正则表达式中,你还必须使用单词”for”来避免歧义。此外,正则表达式可以理解n代表换行符,t代表制表符等。请注意,在Python中,反斜杠字符(\)也用于字符串中的转义序列。例如,”\n”代表换行符,”\t”代表制表符,你还必须写””来表示反斜杠。因此,在这些语言中,你必须写””(两层转义!)来编写正则表达式模式(匹配一个)。等效的正则表达式元字符\ d表示”\d”。