1

下面代码的输出:

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 )

..是:

'I hope this This is a nicely escaped newline \n is replaced with a nicely escaped string'

..所以打印时:

我希望这是一个很好的转义换行符

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

那么当python替换另一个字符串中的'apple'时,它是在对字符串进行转义吗?现在我刚刚完成

reg.sub( rpl.replace('\\','\\\\'), my_string )

这安全吗?有没有办法阻止 Python 这样做?

4

2 回答 2

4

来自help(re.sub)[强调我的]:

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

返回通过替换 repl 替换 string 中模式的最左侧非重叠出现而获得的字符串。 repl 可以是字符串或可调用对象;如果是字符串,则处理其中的反斜杠转义。 如果它是可调用的,它会传递匹配对象并且必须返回要使用的替换字符串。

解决这个问题的一种方法是传递一个lambda

>>> reg.sub(rpl, my_string )
'I hope this This is a nicely escaped newline \n is replaced with a nicely escaped string'
>>> reg.sub(lambda x: rpl, my_string )
'I hope this This is a nicely escaped newline \\n is replaced with a nicely escaped string'
于 2012-08-26T04:08:21.330 回答
0

用于 Pythonre模块的所有正则表达式模式都是未转义的,包括搜索和替换模式。这就是为什么r修饰符通常与 Python 中的正则表达式模式一起使用,因为它减少了编写可用模式所需的“回击”数量。

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 )

按预期工作。

于 2012-08-26T04:14:58.803 回答