Python 正则表达式实现字符串反转义

17 投票
5 回答
2325 浏览
提问于 2025-04-10 23:32

我正在尝试用Python的正则表达式和回溯引用来实现字符串的反转义,但似乎效果不太好。我肯定是哪里做错了,但就是搞不清楚...

>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'

我想把\\[char]替换成\[char],但是在Python中,回溯引用的规则似乎和我以前用过的其他实现不太一样。有人能帮我解释一下吗?

5 个回答

1

我的想法是,我会读取一个经过转义的字符串,然后把它解转义(这个功能在Python中是缺失的,实际上你根本不应该用正则表达式来解决这个问题)。可惜的是,我没有被反斜杠搞糊涂……

再举个例子:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

我希望它打印出来的是

This is 
ridiculous
3

嗯,我觉得你可能漏掉了“r”或者反斜杠数错了……

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

如果我没理解错的话,这就是你想要的。

我怀疑更常见的请求是这个:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

感兴趣的同学还应该看看肯·汤普森的《信任信任的反思》,在这篇文章里,他用类似的例子来解释信任那些你没有自己从机器代码启动的编译器的风险。

10

这不是安德斯的第二个例子所做的吗?

在2.5版本中,还有一种叫做string-escape的编码方式可以使用:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 

撰写回答