2010-03-11 49 views
29

给定一个包含字符串的变量是否有一种快速的方法将其转换为另一个原始字符串变量?在Python中铸造原始字符串python

下面的代码应该说明什么IM后...

def checkEqual(x, y): 
    print True if x==y else False 

line1 = "hurr..\n..durr" 
line2 = r"hurr..\n..durr" 
line3 = "%r"%line1 

print "%s \n\n%s \n\n%s \n" % (line1, line2, line3) 

checkEqual(line2, line3)  #outputs False 

checkEqual(line2, line3[1:-1]) #outputs True 

到目前为止,我已经找到了最接近的是,这似乎返回原始字符串尽管单引号内的%R格式的标志。有没有更简单的方法来做到这一点,如line3 = raw(line1)种类的东西?

+0

请不要使用“铸造”一词。 Python没有这样的事情。您想要将原始字符串“转换”或“转换”为另一个字符串。 “快”与它无关。 –

+2

'checkEqual'可以简单的'return x == y' – pradyunsg

+1

谢谢@Schoolboy指出。它总是让我看到像'print True True if else if'这样多余的东西:/ – OozeMeister

回答

61
"hurr..\n..durr".encode('string-escape') 
+6

很好。与各种编解码器str.encode()正是我以后。 'unicode-escape'实际上解决了我也遇到的另一个问题。欢呼 – dave

+1

这对'\ w'等不起作用 –

+7

我在Python3.3中遇到错误 LookupError:unknown encoding:string-escape – Erik

3

还有一种方法:

>>> s = "hurr..\n..durr" 
>>> print repr(s).strip("'") 
hurr..\n..durr 
+0

如果's'中有一个''',那么这将不起作用 –

+0

如果该字符串位于字符串中间,它应该没问题,但它绝对不是健壮的(例如,它对Unicode字符串很敏感) 。 – Seth

0
>>> v1 = 'aa\1.js' 
>>> re.sub(r'(.*)\.js', repr(v1).strip("'"), 'my.js', 1) 
'aa\\x01.js 

>>> re.sub(r'(.*)\.js', r'aa\1.js', 'my.js', 1) 
'aamy.js' 

而且

>>> re.sub(r'(.*)\.js', raw(v1), 'my.js', 1) 
'aamy.js' 

,更好的原料方法impleme ntation

def raw(text): 
    """Returns a raw string representation of text""" 
    return "".join([escape_dict.get(char,char) for char in text]) 
1

上面显示了如何编码。

'hurr..\n..durr'.encode('string-escape') 

这种方式将解码。

r'hurr..\n..durr'.decode('string-escape') 

Ex。

In [12]: print 'hurr..\n..durr'.encode('string-escape') 
hurr..\n..durr 

In [13]: print r'hurr..\n..durr'.decode('string-escape') 
hurr.. 
..durr 

这允许在两个方向上“铸造/变形原始字符串”。一个实际的例子是当json包含一个原始字符串并且我想很好地打印它。

{ 
    "Description": "Some lengthy description.\nParagraph 2.\nParagraph 3.", 
    ... 
} 

我会做这样的事情。

print json.dumps(json_dict, indent=4).decode('string-escape')