【问题标题】:How can I print out the string "\b" in Python如何在 Python 中打印出字符串“\b”
【发布时间】:2012-05-09 16:10:03
【问题描述】:

在我的编译器类中,我决定用 Python 编写编译器,因为我喜欢用 Python 编程,尽管我遇到了一个关于如何打印字符的有趣问题。我正在编写的词法分析器要求以非常特殊的方式将包含换页符和退格字符的字符串打印到标准输出:用双引号括起来,并分别打印为 \f 和 \b。我得到的最接近的:

print("{0!r}".format("\b\f"))

产生

'\x08\x0c'

注意单引号和 utf8 编码。我关心的其他两个字符的相同命令几乎可以工作:

print("{0!r}".format("\n\t"))

给予:

'\n\t'

明确地说,我需要符合规范的结果(包括引号)是

"\b\f"

查找 \b 和 \f 并用“\b”和“\f”替换它们的简单方法似乎不起作用......“\”只是 Python 打印反斜杠的方式,所以我可以似乎永远不会像预期的那样得到“\b\f”。

使用各种字符串编码似乎没有帮助。我已经得出结论,我需要编写一个自定义 string.Formatter,但我想知道是否还有另一种我错过的方法。

编辑:感谢所有答案。不过,我认为我在提出这个问题方面做得并不好。根本问题是我将字符串格式化为原始格式,因为我希望文字换行符显示为“\n”,而文字制表符显示为“\t”。但是,当我开始使用原始格式打印字符串时,我无法按照以下所有答案的建议打印出“\b”和“\f”。

今晚我将确认这一点,但基于这些答案,我认为我应该使用的方法是正常格式化输出,并捕获所有文字“\n”、“\t”、“\b” , 和带有转义序列的 "\f" 字符将根据需要打印它们。我仍然希望避免使用 string.Formatter。

EDIT2:我要使用的最后一种方法是使用非原始字符串格式。非抽象版本看起来像:

print('"{0!s}"'.format(a.replace("\b", "\\b").replace("\t", "\\t").replace("\f", "\\f").replace("\n","\\n")))

【问题讨论】:

  • 您始终可以在字符串之前使用r 定义“逐字”字符串,如下所示:print r'\b\f'
  • 这是一种名为“Cool”的课堂语言,由 Alex Aiken 教授设计。整个问题有点做作,因为编译器的不同部分通过 unix 管道进行通信,所以输出的确切格式非常重要。显然,这是课堂环境的产物。

标签: python string compiler-construction


【解决方案1】:

使用原始字符串:

>>> print(r'\b')
    \b

【讨论】:

  • 对。但是给定一个包含“\b\f”的字符串,我如何将其打印为原始字符串?我发现 print(r'"\b\f"') 给出了正确的结果,但是给定一个不是原始的字符串,我该怎么做?
  • @R.P.Dillon:您应该在创建字符串时控制它。
  • @R.P.Dillon 看看这个code.activestate.com/recipes/…
  • @StevenRumbalski,在我看来,目标是改变字符串的打印方式,而不是字符串的内容。我认为出于其他原因它需要是文字字符。
  • @MarkRansom 没错,尽管基于这些答案,我认为我将不得不更改字符串的内容,即使只是为了打印。
【解决方案2】:
print("{0!r}".format("\b\f".replace("\b", "\\b").replace("\f", "\\f")))

或者,更简洁:

def escape_bs_and_ff(s):
    return s.replace("\b", "\\b").replace("\f", "\\f")

print("{0!r}".format(escape_bs_and_ff("\b\f"))

【讨论】:

  • 当我像你提到的那样执行第一个时,我仍然得到相同的结果:'\x08\x0c'。但是这个答案看起来最好,因为它可以接受现有的非原始字符串,这是我必须处理的。
  • @R.P.Dillon,对不起,我把括号放错了地方。我在 Python 2.7 上,所以我没有与 print 相同的语法。
  • 我认为这将直接导致解决方案。我今晚试试。谢谢!
【解决方案3】:
>>> print(r'"\b\f"')
"\b\f"

r 表示原始字符串或逐字字符串,这意味着它不会尝试将 \n 之类的内容解析为换行符,而是直接将字符串 \n

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2018-06-13
    • 1970-01-01
    • 2021-07-17
    • 2022-11-04
    • 2020-09-13
    • 1970-01-01
    • 2013-10-10
    • 2023-01-09
    相关资源
    最近更新 更多