在python中只剥离一次字符

在python中只剥离一次字符,python,string,strip,Python,String,Strip,我正在解析一个文件中的值,其中一些可以是字符串文字,用双引号括起来。要获得实际值,我必须去掉双引号: >>> raw_value = r'"I am a string"' >>> processed_value = raw_value.strip('"') >>> print(processed_value) I am a string 但是,有些值包含转义双引号,可以在末尾: >>> raw_value = r'"Sim

我正在解析一个文件中的值,其中一些可以是字符串文字,用双引号括起来。要获得实际值,我必须去掉双引号:

>>> raw_value = r'"I am a string"'
>>> processed_value = raw_value.strip('"')
>>> print(processed_value)
I am a string
但是,有些值包含转义双引号,可以在末尾:

>>> raw_value = r'"Simon said: \"Jump!\""'
>>> processed_value = raw_value.strip('"')
>>> print(processed_value)
Simon said: \"Jump!\
您可以在这里看到我的问题:转义的双引号被剥离,这会在我写回文件时留下一个孤立的双引号,使其无法读取。我可以做到:

def unique_strip(some_str):

    beginning = 1 if some_str.startswith('"') else 0
    end = -1 if some_str.endswith('"') and some_str[-2] != "\\" else None
    return some_str[beginning:end]
使用前面的示例:

>>> unique_strip(raw_value)
'Simon said: \\"Jump!\\"'
>>> raw_value = r'"Simon said: \"Jump!\"'
>>> unique_strip(raw_value)
'Simon said: \\"Jump!\\"'
因此,现在即使缺少尾随双引号,它也可以工作。有没有一种更像python的方法来实现这一点,比如使用内置的strip?如果没有,我的方法是否有任何错误或漏洞

更新

我猜我的函数会为某个输入(比如某个_str='')引发IndexError。所以也许:

def unique_strip(some_str):

    beginning = 1 if some_str.startswith('"') else 0
    end = -1 if len(some_str) > 1 and some_str.endswith('"') and some_str[-2] != "\\" else None
    return some_str[beginning:end]

最简单但不是最安全的方法是将\替换为其他地方不会出现的字符串。然后剥去衣服,换回来

raw_value = r'"Simon said: \"Jump!\""'

IMPOSSIBLE_STR = '\\"3'
raw_value.replace('\\"', IMPOSSIBLE_STR).strip('"').replace(IMPOSSIBLE_STR,'\\"')
Out[102]: 'Simon said: \\"Jump!\\"'

我想后面不太可能有数字


正则表达式可能会更好地解决这个问题,前提是您编写了正确的正则表达式

这看起来像是ast.literal的工作_eval@PM2Ring与直接字符串操作相比,这将是非常缓慢的。此外,如果字符串没有在内部用双引号括起来,它会断开。您可以使用look arounds查看re.sub。您可以str.replace\to字符串中未出现的内容,strip,然后replaceback@ValentinB.,ESCAPEDDOUBLEQUOTE12138没有问题。您可以将操作链接在一起,而不必关心中间结果。我认为后面不太可能有数字。。这在我的环境中是可能的,所以我选择了一个相当长的中间替代品。我已经实现了它,而且很有效,所以如果没有人能想出一个神奇的正则表达式或者一个更好的解决方案,我会接受你的。@ValentinB。如果你的火箭爆炸了,别怪我