如何用Python打印字符串“\b”

2024-05-20 09:09:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在compilers类中,我决定用Python编写编译器,因为我喜欢用Python编程,不过我遇到了一个有趣的问题,即如何打印字符。我正在编写的lexer要求以非常特殊的方式将包含formfeed和backspace字符的字符串打印到stdout:用双引号括起来,分别打印为\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")))

Tags: 方法字符串答案format编码string编译器formatter
1条回答
网友
1楼 · 发布于 2024-05-20 09:09:33
>>> print(r'"\b\f"')
"\b\f"

r表示原始字符串或逐字字符串,这意味着它不是试图将类似\n的内容解析为换行符,而是逐字生成字符串\n

网友
2楼 · 发布于 2024-05-20 09:09:33

使用原始字符串:

>>> print(r'\b')
    \b
网友
3楼 · 发布于 2024-05-20 09:09:33
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"))

相关问题 更多 >