Python正则表达式实现字符串unescaping

时间:2008-08-17 18:20:21

标签: python regex backreference

我正在尝试使用Python正则表达式和反向引用来实现字符串unescaping,并且它似乎不希望工作得很好。我确定这是我做错了但我无法弄清楚是什么......

>>> 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 个答案:

答案 0 :(得分:8)

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

在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 
>>> 

答案 1 :(得分: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的Reflections on Trusting Trust",其中我们的英雄使用类似的例子来解释你自己没有从机器代码中引导的信任编译器的危险。

答案 2 :(得分:1)

我的想法是,我将读取一个转义字符串,并将其转换为unescape它(一个特别缺乏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 :(得分:0)

你被Python的结果字符串表示欺骗了。 Python表达式:

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

表示字符串

This is \n a test \r

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

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r

答案 4 :(得分:0)

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

我很抱歉,如果我作为一个家伙出现,我对Python完全感到沮丧。我用过的所有其他正则表达式引擎都支持这一点,我无法理解为什么这样做不起作用。

感谢您的回复; string.decode('string-escape')函数正是我最初想要的。如果有人对正则表达式反向引用问题有一般解决方案,请随意发布,我也会接受这个问题。