76

我正在尝试找到一种从变量中以原始形式打印字符串的方法。例如,如果我将环境变量添加到 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的变量,仍然使用测试?如果只是这样就好了

print(raw(test))

但它不是

4

13 回答 13

51

我遇到了类似的问题并偶然发现了这个问题,并且由于 Nick Olson-Harris 的回答知道解决方案在于更改字符串。

两种解决方法:

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

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

    这使其独立于平台,现在可以与.encode. 如果这是您的选择,那么它是更优雅的解决方案。

  2. 如果您的字符串不是路径,请以与 python 字符串兼容的方式定义它,在这种情况下通过转义反斜杠:

    test = 'C:\\Windows\\Users\\alexb\\'
    print(repr(test))
    
于 2014-11-11T14:53:01.983 回答
33

您不能将现有字符串变为“原始”。解析器可以理解文字的r前缀;它告诉它忽略字符串中的转义序列。但是,一旦解析了字符串文字,原始字符串和“常规”字符串之间就没有区别了。例如,如果您有一个包含换行符的字符串,则无法在运行时判断该换行符是否来自转义序列,来自三引号字符串中的文字换行符(甚至可能是原始换行符!),来自调用,通过从文件中读取它,或者您可能想出的任何其他内容。从任何这些方法构造的实际字符串对象看起来都是一样的。\nchr(10)

于 2013-09-09T21:45:57.063 回答
32

通常,要从字符串变量中生成原始字符串,我使用以下命令:

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

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

输出:

'C:\\\\Windows\\Users\\alexb'
于 2018-11-04T14:01:15.673 回答
10

我知道我回答得太晚了,但是对于阅读本文的人来说,我找到了一种更简单的方法

myVariable = 'This string is supposed to be raw \'
print(r'%s' %myVariable)
于 2019-07-11T09:26:49.070 回答
4

尝试这个。根据您想要的输出类型。有时您可能不需要在打印的字符串周围加上单引号。

test = "qweqwe\n1212as\t121\\2asas"
print(repr(test)) # output: 'qweqwe\n1212as\t121\\2asas'
print( repr(test).strip("'"))  # output: qweqwe\n1212as\t121\\2asas
于 2020-08-10T01:33:14.443 回答
4

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

您可以将路径“\”的任何反斜杠更改为正斜杠“/”,然后再将它们存储在变量中。正斜杠不需要转义:

>>> mypath = os.getcwd().replace('\\','/')  
>>> os.path.exists(mypath)  
True  
>>>   
于 2016-03-10T15:06:17.607 回答
3

我将变量分配给大型复杂模式字符串以与 re 模块一起使用,它与其他几个字符串连接,最后我想打印它然后复制并在 regex101.com 上检查。但是当我在交互模式下打印它时,我得到双斜杠 - '\\w' 正如@Jimmynoarms 所说:

python 3x的解决方案:

print(r'%s' % your_variable_pattern_str)
于 2020-04-05T08:31:56.780 回答
2

只需简单地使用 r'string'。希望这会对您有所帮助,因为我看到您还没有得到预期的答案:

    test = 'C:\\Windows\Users\alexb\'
    rawtest = r'%s' %test
于 2020-02-26T10:29:49.090 回答
1

由于 \" 结尾的转义字符,您的特定字符串将无法按键入的方式工作,不允许它在引号中关闭。

也许我在那个方面是错误的,因为我对 python 还很陌生,所以如果是这样,请纠正我,但是,稍微改变一下以适应它,repr() 函数将完成复制存储在 a 中的任何字符串的工作变量作为原始字符串。

你可以通过两种方式做到这一点:

>>>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\\'

该字符串将用单引号复制,因此您需要在之后将其剥离。

于 2018-08-25T18:34:12.553 回答
0

使用以下方法之一将反斜杠替换为正斜杠:

  • re.sub(r"\", "/", x)
  • re.sub(r"\", "/", x)
于 2020-04-08T19:56:33.887 回答
0

这是诀窍

>>> repr(string)[1:-1]

这是证明

>>> repr("\n")[1:-1] == r"\n"
True

如果需要,它可以很容易地外推到一个函数中

>>> raw = lambda string: repr(string)[1:-1]
>>> raw("\n")
'\\n'
于 2021-07-11T01:57:22.617 回答
-1

我写了一个小函数..但对我有用

def conv(strng):
    k=strng
    k=k.replace('\a','\\a')
    k=k.replace('\b','\\b')
    k=k.replace('\f','\\f')
    k=k.replace('\n','\\n')
    k=k.replace('\r','\\r')
    k=k.replace('\t','\\t')
    k=k.replace('\v','\\v')
    return k
于 2020-05-27T18:22:26.723 回答
-3

这是一个简单的解决方案。

address = 'C:\Windows\Users\local'
directory ="r'"+ address +"'"

打印(目录)

"r'C:\\Windows\\Users\\local'"
于 2021-03-10T10:42:17.790 回答