在 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!\"'
我想 \"
后跟数字的可能性很小。
正则表达式可能会更好地解决问题,前提是您编写了正确的正则表达式!
我正在解析文件中的值,其中一些可以是字符串文字,用双引号括起来。要获得实际值,我必须去掉双引号:
>>> 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!\"'
我想 \"
后跟数字的可能性很小。
正则表达式可能会更好地解决问题,前提是您编写了正确的正则表达式!