带真实换行符的Python repr字符串

时间:2019-03-28 22:53:22

标签: python string repr

我想使用repr()来获取Python编码的字符串文字(我可以将其粘贴到某些源代码中),但是我更希望使用带三引号的带有真实换行符的字符串,而不是{{1 }}转义序列。

我可以对字符串进行后处理,以将\n转换为换行符并添加更多引号,但是如果源中有\n,那么我就不想匹配

最简单的方法是什么?


示例输入:

\\n

或作为Python字符串:

foo
bar

所需的输出:

'foo\nbar'

三重单引号或三重双引号很好,但是我确实希望这样在多行中将其弄坏。


到目前为止我所拥有的:

'''foo\xf0\x9f\x92\xa9
bar'''

我仍在尝试找出正则表达式,以避免转换转义的#!/usr/bin/env python import sys import re with open(sys.argv[1], 'r+') as f: data = f.read() f.seek(0) out = "''" + re.sub(r"\\n", '\n', repr(data)) + "''" f.write(out) f.truncate()

目标是,如果将其粘贴回Python源文件中,则会得到与读入完全相同的内容。


我正在使用Python 2.7.14

2 个答案:

答案 0 :(得分:2)

splitlines并分别编码每行怎么样:

s = 'foo\nbar'

r = "'''" + '\n'.join(repr(x)[1:-1] for x in s.splitlines()) + "'''"

assert eval(r) == s

如果您使用的是python2,并且输入是unicode,则repr[2:-1]也会剥离开头的u。 py3和字节输入也是如此。

答案 1 :(得分:0)

将文本文件转换为可粘贴到源代码中的字符串的最终解决方案:

#!/usr/bin/env python
import sys
import re
import io

with io.open(sys.argv[1], 'r+', encoding='utf8') as f:
    data = f.read()
    f.seek(0)
    out = u"u'''" + u'\n'.join(repr(x)[2:-1] for x in data.splitlines()) + u"'''"
    f.write(out)
    f.truncate()

警告:它将覆盖源文件。我为此使用了临时文件,所以这就是我想要的。

信用: