【问题标题】:Is there any simple way to add \n in r'' string in python有什么简单的方法可以在 python 中的 r'' 字符串中添加 \n
【发布时间】:2013-02-05 02:55:40
【问题描述】:

我需要将几条路径添加到一个末尾带有 \n 字符的单行字符串中。为方便起见,在字符串的前面添加了关键字 r。在这种情况下字符'\n'不能正常显示。

例如

str_output = r'name = %(name)s, some_dir = \\folder0\\..., description = "%(des)s\n'
print(str_output % {'name':'new', 'des':'new add one'})

输出将显示没有换行符。目前我使用字符串加来绕过这个问题。如:

str_output = r'name = %(name)s, some_dir = \\folder0\\..., description = "%(des)s' + '\n'

而不是之前定义的 str_output。我很好奇有没有其他方便的方法可以做到这一点?字符串 plus 在我的代码中看起来很难看。谢谢!

【问题讨论】:

  • 它不起作用的原因是字符串前面的r - 它按字面意思对待每个字符并且转义序列没有转义。
  • 是的,我知道字符r的功能,但是如果我使用这个功能,是不是意味着不能添加字符'\n'?
  • 不使用原始字符串 - r'\n''\\n' 相同,后者打印 '\n' 而不是换行符。
  • 是的,但是如果有一种简单的方法可以在原始字符串中添加“\n”,那么代码看起来会比与字符串加号混合更直接有效。 :)

标签: python string format


【解决方案1】:

r 您放在字符串文字开头之前向 Python 表明这是一个“原始”字符串,并且其中的转义序列应被视为常规字符。我怀疑您这样做是因为您拥有双反斜杠字符,您不希望 python 将其解释为单个转义的反斜杠字符。但是,原始文字也会阻止 \n 被解释为换行符。

唯一的解决方法是将原始字符串文字与换行符分开,然后加入它们(就像您已经在做的那样),或者使用常规字符串文字并转义您的反斜杠:

str_output = 'name = %(name)s, some_dir = \\\\folder0\\\\..., description = "%(des)s\n'

【讨论】:

  • 键入双斜杠输入一个是让我发疯。 :^D...如果一个字符串中有很多'\',哇,那需要大量输入'\\\\\'。
  • 是的,我认为你在问题中所说的你现在正在做的方式可能最适合你目前的情况。 r"stuff\\with\\backslashes\"+"\n"
  • 感谢您的建议。 :)
【解决方案2】:

不,没有办法将转义序列放在原始字符串中。我会使用与您相同的解决方法。

【讨论】:

    【解决方案3】:

    字符串文字前缀r 表示原始字符串,即转义符是常规字符。如果你真的想使用原始字符串,你可以试试这样的:

    name = 'new'
    des = 'new add one'
    newline = '\n'
    str_output = rf'name = {name}s, some_dir = \\folder0\\..., description = "{des}s{newline}s'
    print(str_output)
    

    虽然这意味着您必须在每个dict 中都带有newline

    另一种更有意义的做法:

    str_output = r'name = %(name)s, some_dir = \\folder0\\..., description = "%(des)s%(\n)s'
    print(str_output % {'name':'new', 'des':'new add one', '\\n': '\n'})
    

    【讨论】:

    • 这对我来说真的是一种新的方式。似乎没有优雅的方式可以在 python 中完成这项工作。 :( 但这不会影响我喜欢使用 python 编程。
    • 好吧,字符串在所有语言中都是一种痛苦,Python 是为数不多的“优雅”处理它们的语言之一
    【解决方案4】:

    我在这里参加聚会有点晚了,但这是我最近提出的要求。 我想要一个带有 LaTeX 解析的多线轴标签,用于matplotlib 中的二维直方图。

    我的解决方案是用括号开始续行,然后结合普通字符串和原始字符串来实现换行:

    xlabel=('Time of Flight (ToF)\n'
            r'[$\times10^3$ arb. units]')
    

    这是这样的:

    这可以扩展到更复杂的字符串。

    【讨论】:

      【解决方案5】:

      正如this answer 中所述,使用括号将raw stringsimplicit concatenation of string literals 的普通字符串组合起来。也使用formatted string literals,在 Python >= 3.6 中可用,结果是:

      name = 'some_name'
      des = 'some decription'
      message = (rf'{name = !s}s, some_dir = \folder0\..., description = {des}s' '\n')
      print(message)
      

      【讨论】:

      • 不错的输入。新语法对这个问题有更直观的答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2011-06-08
      • 2018-11-11
      相关资源
      最近更新 更多