如何从变量中打印原始字符串?(没有得到答案)

92

我正在尝试找到一种从变量中以原始形式打印字符串的方法。例如,如果我在Windows中为路径添加一个环境变量,该变量可能看起来像'C:\\Windows\Users\alexb\',我知道可以执行以下操作:

print(r'C:\\Windows\Users\alexb\')

但是我无法在变量前面加上 r,例如:

test = 'C:\\Windows\Users\alexb\'
print(rtest)

显然只是尝试打印rtest

我也知道还有其他的

test = 'C:\\Windows\Users\alexb\'
print(repr(test))

但是这会返回'C:\\Windows\\Users\x07lexb',而且也是如此。

test = 'C:\\Windows\Users\alexb\'
print(test.encode('string-escape'))

我想知道有没有一种优雅的方式可以使一个包含路径的变量以RAW形式打印出来,仍然使用test?如果可以只需要:

print(raw(test))

但其实它不是。


3
“r'C:\Windows\Users\alexb'”实际上是一个语法错误,顺便提一下。 - kindall
14个回答

61

我遇到了类似的问题,偶然看到了这个问题,通过 Nick Olson-Harris 的回答,我知道解决方法是更改字符串。

有两种解决方法:

  1. 使用本地的Python函数获取您想要的路径,例如:

  2. test = os.getcwd() # In case the path in question is your current directory
    print(repr(test))
    

    这使得它成为平台无关的,并且现在可与.encode一起使用。如果您有此选项,则是更优雅的解决方案。

  3. 如果您的字符串不是路径,则以与Python字符串兼容的方式定义它,例如通过转义反斜杠:

  4. test = 'C:\\Windows\\Users\\alexb\\'
    print(repr(test))
    

47

通常,要将字符串变量转换为原始字符串,我使用以下代码:

string = "C:\\Windows\Users\alexb"

raw_string = r"{}".format(string)

输出:

'C:\\\\Windows\\Users\\alexb'

1
有趣的是,这对于\v无效。 >>> k = "\vsadfkjhkasdf\nasdfsadf" >>> r = r"{}".format(k) >>> r '\x0bsadfkjhkasdf\nasdfsadf' - malhar
这个代码对于 variable = r"{}".format(another_variable) 就像魔法一样。 - Alper
无法运行:str1 = 'dfdf\"dfdfd' str2 = r"{}".format(str1) print(str2)输出结果为: dfdf"dfdfd - user07

40
您无法将现有的字符串转换为“原始”格式。文字中的r前缀是由解析器理解的,它告诉解析器忽略字符串中的转义序列。然而,一旦字符串文字被解析,原始字符串与“常规”字符串之间没有区别。例如,如果您有一个包含换行符的字符串,运行时就无法知道该换行符是来自转义序列\n、三引号字符串中的文字换行符(甚至可能是原始字符串),chr(10)调用,从文件中读取它,或者其他任何您能想到的方式。从这些方法构建的实际字符串对象看起来都是相同的。

1
我相信你真正理解了重点。当我需要在re.sub调用中使用re和变量(包括Windows路径等情况)时,以上方法都不适用于我。我通过重新转义字符串来解决问题(虽然效果不佳):path = r"c:\this\is\a\test.txt" ; part_to_be_changed = r"c:\this" ; part_to_be_changed_reescaped = re.sub("\\\\", "\\\\\\\\", part_to_be_changed) ; new_part = "d:\\this_really" ; new_part_reescaped = re.sub("\\\\", "\\\\\\\\", new_part) ; new_string = re.sub(part_to_be_changed_reescaped, new_part_reescaped, path) ; print(new_string) ; >> d:\this_really\is\a\test.txt - shub
这应该是被接受的答案。或者至少需要成为其中的一部分。https://www.pythontutorial.net/python-basics/python-raw-strings/ - geryxyz

14

我知道回答已经太晚了,但对于阅读此内容的人,我找到了一个更容易的方法来做到这一点。

myVariable = 'This string is supposed to be raw \'
print(r'%s' %myVariable)

7

尝试这个。根据你想要的输出类型不同,有时你可能不需要在打印的字符串周围使用单引号。

test = "qweqwe\n1212as\t121\\2asas"
print(repr(test)) # output: 'qweqwe\n1212as\t121\\2asas'
print( repr(test).strip("'"))  # output: qweqwe\n1212as\t121\\2asas

请说明downvote的原因。我昨天刚在我的应用程序中使用了这种方法。 - kumar chandraketu

4

在存储或操作原始字符串之前,要去掉转义字符:

您可以将路径中的反斜杠 '\' 替换为正斜杠 '/',然后再存储到变量中。正斜杠不需要转义:

>>> mypath = os.getcwd().replace('\\','/')  
>>> os.path.exists(mypath)  
True  
>>>   

4

只需简单使用r'字符串'。希望这能帮到你,因为我看到你还没有得到你期望的答案:

    test = 'C:\\Windows\Users\alexb\'
    rawtest = r'%s' %test

3

我将一个变量赋值为一个用于与re模块一起使用的复杂字符串,该字符串连接了其他几个字符串,最终我想将其打印出来,然后复制并在regex101.com上进行检查。但是当我在交互模式下打印它时,我得到了双斜杠- '\\w',就像@Jimmynoarms所说:

Python 3x的解决方案:

print(r'%s' % your_variable_pattern_str)

非常好的答案!对我有用,但是你能解释一下为什么这个方法有效而其他方法无效吗?这是 Python 中的渲染问题吗? - Farhan Hai Khan

3
要将一个变量转换为原始字符串,只需使用
rf"{var}"

r 是原始字符串,f 是格式化字符串;将它们结合在一起,就能轻松使用。


1
你的特定字符串无法按照输入的方式工作,因为末尾有转义字符 \", 这将不允许引号关闭。

也许我在这方面是错误的,因为我还是Python的新手,如果是这样,请纠正我,但是稍微调整一下,使用repr()函数可以将存储在变量中的任何字符串重新生成为原始字符串。

你可以用两种方法实现:

>>>print("C:\\Windows\Users\alexb\\")

C:\Windows\Users\alexb\

>>>print(r"C:\\Windows\Users\alexb\\")
C:\\Windows\Users\alexb\\

将它存储在一个变量中:

test = "C:\\Windows\Users\alexb\\"

使用repr()函数:
>>>print(repr(test))
'C:\\Windows\Users\alexb\\'

或者使用 %r 进行字符串替换。
print("%r" %test)
'C:\\Windows\Users\alexb\\'

这个字符串将会使用单引号进行复制,因此您需要在之后去掉它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接