【发布时间】: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