如何去掉字符串表示中的单引号?

6

这个示例代码打印了来自文件的行的表示方式。它允许查看其内容,包括控制字符,例如'\n',在单行上显示 - 因此我们称其为行的“原始”输出。

print("%r" % (self.f.readline()))

然而,输出结果中出现了每个端点都带有单引号'字符,而文件中并没有这些字符。

'line of content\n'

如何消除输出结果周围的单引号?
(在Python 2.7和3.6中行为相同。)


2
这就是这个格式说明符被创建的目的。为什么你想要移除引号?它们存在是为了显示字符串的边界。 - ForceBru
1
使用 str.strip("'")[1:-1] 切片。 - Jean-François Fabre
1
指定的 "r" 并不代表 "raw",而是代表 "representation",这意味着 Python 对象的表示形式。由于在这种情况下它是一个字符串,因此始终带引号。 - martineau
那不是“原始说明符”。“%r”表示在被替换的对象上调用repr - user2357112
显示剩余7条评论
2个回答

8

%r 接受字符串的repr表示。它会按您需要转义换行符等内容,但同时也添加引号。如果想要去掉引号,可以使用索引切片来完成。

print("%s" %(repr(self.f.readline())[1:-1]))

如果您只需要打印这个内容,完全不需要通过字符串格式化器进行处理。
print(repr(self.f.readline())[1:-1])

这也可以运行:
print("%r" %(self.f.readline())[1:-1])

或者添加一对额外的括号:print(("%r" %(self.f.readline()))[1:-1]) - ForceBru
1
完全没有必要使用 "%s",你可以直接打印切片后的 repr 结果。 - user2357112
@TMWP - 我不是特别喜欢编辑中的第三个选项 print("%r" %(self.f.readline())[1:-1])。如上所述,如果格式仅为 "%r",则无需通过格式化程序进行传递。第二个选项已经是更好的选择了。 - tdelaney
@StefanPochmann - 你是正确的!你需要更多括号print(("%r" %(f.readline()))[1:-1]) - tdelaney
在这场辩论中,没有人说出为什么这很重要。如果直接使用repr()是否比使用格式化程序更有效?使用%r是否会有明显的开销,还是所有这些都是“我喜欢这个”,“我不喜欢那个”...我猜是这样,但除了“喜欢”和“不喜欢”之外,这个帖子上没有人用逻辑来证明他们的理由。尽管如此,提出了很好的建议,我的编码解决方案正在使用索引而不是我最初发布的答案,当更好的答案出现在这里时,我删除了它。 - TMWP
显示剩余5条评论

4
尽管这种方法可能有些过于复杂,但在Python中,您可以定义自己的字符串类并继承大多数(如果不是全部)内置类型,包括str。这意味着您可以定义自己的字符串表示形式。以下示例说明了如何使用该功能:
class MyStr(str):
    """ Special string subclass to override the default representation method
        which puts single quotes around the result.
    """
    def __repr__(self):
        return super(MyStr, self).__repr__().strip("'")

s1 = 'hello\nworld'
s2 = MyStr('hello\nworld')

print("s1: %r" % s1)
print("s2: %r" % s2)

输出:

s1: 'hello\nworld'
s2: hello\nworld

虽然你说得没错,但对于刚接触Python的人来说,这是一段非常有趣的代码。 - TMWP
没有意识到我可以对不止一个答案投票。 - TMWP
奇怪的是,您花时间查找代码并回答了这个问题,还有其他人也这样做。它在评论中引发了关于最佳解决方案的争议,我在过程中发现了一些有用的东西,可能对新接触Python的其他人有所帮助,但问题本身仍然停留在零分。尽管您付出了努力,难道您也不喜欢这个问题吗? - TMWP
或者只需在MyStr中覆盖__repr__方法,使用def __repr__(self): return self.__str__()即可。 - fhgd
@fhgd:你提出的建议并不等同于原来的方式,因为这样会导致子字符串 helloworld 被分别打印在不同的行上。 - martineau
@martineau:哦,这个情况我错过了。谢谢! - fhgd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接