正则表达式替换中的Python取消跳过字符串

正则表达式替换中的Python取消跳过字符串,python,regex,escaping,Python,Regex,Escaping,代码的输出如下所示: rpl = 'This is a nicely escaped newline \\n' my_string = 'I hope this apple is replaced with a nicely escaped string' reg = re.compile('apple') reg.sub( rpl, my_string ) …是: …因此,在打印时: 我希望这是一个很好的逃脱新线 替换为一个很好的转义字符串 那么,python在替换另一个字符串中的“appl

代码的输出如下所示:

rpl = 'This is a nicely escaped newline \\n'
my_string = 'I hope this apple is replaced with a nicely escaped string'
reg = re.compile('apple')
reg.sub( rpl, my_string )
…是:

…因此,在打印时:

我希望这是一个很好的逃脱新线

替换为一个很好的转义字符串

那么,python在替换另一个字符串中的“apple”时,是在回避这个字符串吗?现在我已经完成了

reg.sub( rpl.replace('\\','\\\\'), my_string )
这安全吗?有没有办法阻止Python这样做?

来自helpre.sub[强调我的]:

子模式,repl,字符串,计数=0,标志=0

返回通过替换最左边的字符串获得的字符串 字符串中模式的非重叠引用由 替换回复。repl可以是字符串,也可以是可调用的; 如果是字符串,则处理其中的反斜杠转义。如果是 一个可调用函数,它传递了match对象,并且必须返回 要使用的替换字符串

绕过此问题的一种方法是通过lambda:

从helpre.sub[强调我的]:

子模式,repl,字符串,计数=0,标志=0

返回通过替换最左边的字符串获得的字符串 字符串中模式的非重叠引用由 替换回复。repl可以是字符串,也可以是可调用的; 如果是字符串,则处理其中的反斜杠转义。如果是 一个可调用函数,它传递了match对象,并且必须返回 要使用的替换字符串

绕过此问题的一种方法是通过lambda:


Python的re模块中使用的所有正则表达式模式都是未scaped的,包括搜索模式和替换模式。这就是为什么在Python中,r修饰符通常与正则表达式模式一起使用,因为它减少了编写可用模式所需的反向处理量

r修饰符出现在字符串常量之前,基本上使所有\字符(字符串分隔符之前的字符除外)一字不差。因此,r'\\'='\\\''和r'\n'=='\\n'

将您的示例编写为

rpl = r'This is a nicely escaped newline \\n'
my_string = 'I hope this apple is replaced with a nicely escaped string'
reg = re.compile(r'apple')
reg.sub( rpl, my_string )

正如预期的那样工作。

用于Python re模块的所有正则表达式模式都是未scape的,包括搜索和替换模式。这就是为什么在Python中,r修饰符通常与正则表达式模式一起使用,因为它减少了编写可用模式所需的反向处理量

r修饰符出现在字符串常量之前,基本上使所有\字符(字符串分隔符之前的字符除外)一字不差。因此,r'\\'='\\\''和r'\n'=='\\n'

将您的示例编写为

rpl = r'This is a nicely escaped newline \\n'
my_string = 'I hope this apple is replaced with a nicely escaped string'
reg = re.compile(r'apple')
reg.sub( rpl, my_string )

工作正常。

当您说“下面代码的输出…”。。。这是不是意味着你用打印来确定它?还是回答?@BrianCain,抱歉说得含糊不清。这就是字符串的样子。当你说“下面代码的输出…”。。。这是不是意味着你用打印来确定它?还是回答?@BrianCain,抱歉说得含糊不清。这就是绳子的样子。奇怪,不知道为什么会这样。谢谢你的解释!我最后做了rpl.encode'escape_string',因为它使代码非常复杂understandable@Walkerneo:替换模式是不可替换的,但可调用函数将返回它们要替换的确切字符串,因为这意味着它们将已经执行任何必要的处理。因此,可调用替换的输出不是不可替换的。@nneonneo,谢谢,我理解这一点,但它确实使代码看起来有点神秘。阅读它的人可能看不到使用只返回字符串的lambda表达式的用处。@walkereno:如果有办法在代码中给读者留下一条简短消息,解释一下它就好了。^更严重的是,string_escape而不是escape_string似乎是一种完全可行的方法。反斜杠被转义的原因是替换不仅仅是一个普通字符串,而是一个正则表达式替换模式。例如,它可以包含像\1这样的反向引用,以包括来自匹配的组。既然至少有一些越狱事件需要处理,那么将它们全部处理是有意义的。奇怪的是,不知道为什么会这样。谢谢你的解释!我最后做了rpl.encode'escape_string',因为它使代码非常复杂understandable@Walkerneo:替换模式是不可替换的,但可调用函数将返回它们要替换的确切字符串,因为这意味着它们将已经执行任何必要的处理。因此,可调用替换的输出不是不可替换的。@nneonneo,谢谢,我理解这一点,但它确实使代码看起来有点神秘。阅读它的人可能看不到使用只返回字符串的lambda表达式的用处。@walkereno:如果有办法在代码中给读者留下一条简短消息,解释一下它就好了。^更严重的是,string_escape而不是escape_string似乎是一种完全可行的方法。反斜杠被转义的原因是替换不仅仅是一个普通字符串,而是一个正则表达式替换模式。例如,它可以包含像\1这样的反向引用,以包括来自匹配的组。因为至少有一些逃犯需要处理,我
问题中的例子有点做作,我不会处理字符串文字。问题中的例子有点做作,我不会处理字符串文字。
rpl = r'This is a nicely escaped newline \\n'
my_string = 'I hope this apple is replaced with a nicely escaped string'
reg = re.compile(r'apple')
reg.sub( rpl, my_string )