单引号和双引号自动切换

时间:2015-04-24 15:31:33

标签: python string

我有一个简单的问题,我自动在python交换引号类型(单和双)。因此,我无法回到原始文本。

这是一个例子

s1 = ('foo\'bar' , 'bar\"foo', 'dead\'\"beef', 'beef\\\'\"dead')
s2 = unicode(s1)
print repr(s2)
>>>u'("foo\'bar", \'bar"foo\', \'dead\\\'"beef\', \'beef\\\\\\\'"dead\')'

在这个例子中,python为元组的第一个元素进行了引号类型的自动交换。当然这是预期的,因为字符串中只出现单引号。我遇到的问题是我正在尝试读取一个格式与上面的打印值完全相同的文件,包括u,起始引号和尾随引号。有没有办法读取文件并返回原来的s1元组。实际上,我甚至不需要元组里面的字符串。没有编码/解码方案我发现由于自动交换正常工作。当然我可以写一个正则表达式或函数来解决这个问题,但必须有一个python方式来做到这一点。酸洗或任何其他序列化也不适合我。

提前致谢

2 个答案:

答案 0 :(得分:1)

暂时搁置报价问题,让我们专注于您的真正需求:

  
    

读取一个格式与上面打印值完全相同的文件,包括u,起始引号和尾随引号。 ......实际上,我甚至不需要元组里面的字符串

  

如果您有文件,其内容如下:

u'("foo\'bar", \'bar"foo\', \'dead\\\'"beef\', \'beef\\\\\\\'"dead\')'

以下程序将允许您访问内部的字符串:

import ast
with open('x.txt') as input_file:
    for line in input_file:
        strings = ast.literal_eval(ast.literal_eval(line))
        # You can do whatever you want with the `strings` var, e.g:
        assert(strings[0] == "foo'bar")
        assert(strings[0] == 'foo\'bar')
        print strings[0]

参考:

答案 1 :(得分:0)

我并不是100%清楚你想要什么,但我写了一个脚本test.py,其中有两个可能的解决方案,其中一个是@ hitzg'

# @hitzg's solution:
s1 = ('foo\'bar', 'bar\"foo', 'dead\'\"beef', 'beef\\\'\"dead')
s2 = u', '.join([unicode(i) for i in s1])
print repr(s2)

# My tweak, in case that's not quite what you want:
s1 = ("'foo\'bar'", "'bar\"foo'", "'dead\'\"beef'", "'beef\\\'\"dead'")
s2 = u', '.join([unicode(i) for i in s1])
print repr(s2)

以下是此脚本的输出:

In [5]: run test.py
u'foo\'bar, bar"foo, dead\'"beef, beef\\\'"dead'
u'\'foo\'bar\', \'bar"foo\', \'dead\'"beef\', \'beef\\\'"dead\''

这些方法中的任何一种都能满足您的需求吗?如果没有,你能解释一下它们与你想要的有何不同吗?这可能会澄清一些事情,我们可以给你一个更好的答案。