R. *_*lon 3 python compiler-construction string
在我的编译器类中,我决定用Python编写我的编译器,因为我喜欢用Python编程,尽管我遇到了一个关于如何打印字符的有趣问题.我正在编写的词法分析器要求包含formfeed和backspace字符的字符串以非常特殊的方式打印到stdout:用双引号括起来,分别打印为\ f和\ b.我得到的最接近的:
print("{0!r}".format("\b\f"))
Run Code Online (Sandbox Code Playgroud)
产量
'\x08\x0c'
Run Code Online (Sandbox Code Playgroud)
注意单引号和utf8编码.与我关注的另外两个角色相同的命令几乎可以工作:
print("{0!r}".format("\n\t"))
Run Code Online (Sandbox Code Playgroud)
得到:
'\n\t'
Run Code Online (Sandbox Code Playgroud)
要清楚,我需要符合规范的结果(包括引号)是
"\b\f"
Run Code Online (Sandbox Code Playgroud)
像查找\ b和\ f以及用"\ b"和"\ f"替换它们这样的简单方法似乎不起作用......"\"只是Python打印反斜杠的方式,所以我似乎永远不会正如人们所期望的那样得到"\ b\f".
玩各种字符串编码似乎没有帮助.我已经得出结论,我需要编写一个自定义字符串.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")))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6174 次 |
| 最近记录: |