17

我正在尝试使用 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 中的反向引用似乎并不遵循它们在我曾经使用过的所有其他实现中所遵循的相同规则。有人可以解释一下吗?

4

5 回答 5

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 
>>> 
于 2008-08-17T21:36:32.693 回答
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 \
>>>

感兴趣的学生还应该阅读 Ken Thompson 的关于信任信任的思考”,其中我们的英雄使用了一个类似的例子来解释信任编译器的危险,你自己没有从机器代码中引导。

于 2008-08-17T19:01:02.990 回答
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
于 2008-08-17T19:40:49.820 回答
0

您被 Python 对结果字符串的表示所欺骗。Python 表达式:

'This is \\n a test \\r'

表示字符串

This is \n a test \r

这就是我认为你想要的。尝试在每个 p.sub() 调用前添加“打印”以打印返回的实际字符串,而不是字符串的 Python 表示。

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
于 2008-08-17T19:26:33.250 回答
0

标记; 他的第二个示例要求最初将每个转义字符放入数组中,如果转义序列恰好不在数组中,则会生成 KeyError 。除了提供的三个字符(尝试 \va )之外,它会死在任何东西上,并且每次您想要取消转义字符串(或保留全局数组)时枚举每个可能的转义序列是一个非常糟糕的解决方案。类似于 PHP,它使用preg_replace_callback()lambda 而不是preg_replace(),在这种情况下完全没有必要。

很抱歉,如果我对此感到很讨厌,我只是对 Python 感到非常沮丧。我用过的所有其他正则表达式引擎都支持这一点,我不明白为什么这不起作用。

感谢您的回复;该string.decode('string-escape')功能正是我最初寻找的。如果有人对正则表达式反向引用问题有一个通用的解决方案,请随时发布它,我也会接受它作为答案。

于 2008-08-17T21:55:54.167 回答