在 python 中仅剥离一个字符一次

Stripping a character only once in python

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

>>> 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!\"'

因此,即使缺少尾随双引号,它现在也能正常工作。是否有更多 pythonic 方法来执行此操作,例如使用内置 strip ?如果不是,是不是我的方法有什么问题或者漏洞?


更新

我想我的函数会为 some_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!\"'

我想 \" 后跟数字的可能性很小。

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