【问题标题】:Print raw string from variable? (not getting the answers)从变量打印原始字符串? (没有得到答案)
【发布时间】:2013-09-13 11:30:32
【问题描述】:

我正在尝试找到一种从变量中以原始形式打印字符串的方法。例如,如果我向 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))

但事实并非如此

【问题讨论】:

标签: python string printing return


【解决方案1】:

这就是诀窍

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

这是证据

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

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

>>> raw = lambda string: repr(string)[1:-1]
>>> raw("\n")
'\\n'

【讨论】:

    【解决方案2】:

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

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

    打印(目录)

    "r'C:\\Windows\\Users\\local'"
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 请说明投反对票的原因。我昨天刚刚在我的应用程序中使用了这种方法。
      【解决方案4】:

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

      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
      

      【讨论】:

        【解决方案5】:

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

        • re.sub(r"\", "/", x)
        • re.sub(r"\", "/", x)

        【讨论】:

          【解决方案6】:

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

          python 3x 的解决方案:

          print(r'%s' % your_variable_pattern_str)
          

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                我遇到了类似的问题,偶然发现了这个问题,感谢 Nick Olson-Harris 的answer,解决方案在于更改字符串。

                两种解决方法:

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

                【讨论】:

                  【解决方案10】:

                  一般来说,要从字符串变量中生成原始字符串,我使用这个:

                  string = "C:\\Windows\Users\alexb"
                  
                  raw_string = r"{}".format(string)
                  

                  输出:

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

                  【讨论】:

                  • 有趣的是,这不适用于 \v >>> k = "\vsadfkjhkasdf\nasdfsadf" >>> r = r"{}".format(k) >>> r `'\x0bsadfkjhkasdf\nasdfsadf'``
                  • 这对variable = r"{}".format(another_variable) 有效
                  • 它不起作用:`str1 = 'dfdf\"dfdfd' str2 = r"{}".format(str1) print(str2)` 输出:dfdf"dfdfd
                  【解决方案11】:

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

                  也许我在那个方面是错误的,因为我对 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\\'
                  

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

                  【讨论】:

                    【解决方案12】:

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

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

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

                    【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                      • 我相信你真的明白了。当我需要在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
                      猜你喜欢
                      • 1970-01-01
                      • 2017-11-09
                      • 1970-01-01
                      • 2018-09-01
                      • 1970-01-01
                      • 2021-01-11
                      • 2016-01-02
                      相关资源
                      最近更新 更多