3

在我的编译器课程中,我决定用 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")))
4

3 回答 3

5

使用原始字符串:

>>> print(r'\b')
    \b
于 2012-05-09T16:11:43.983 回答
3
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"))
于 2012-05-09T16:16:34.190 回答
0
>>> print(r'"\b\f"')
"\b\f"

表示原始r或逐字字符串,这意味着它不会尝试将内容解析\n为换行符,而是从字面上生成字符串\n

于 2012-05-09T16:18:18.927 回答