我有一个字符串,可能包含也可能不包含语法上有效的Python字符串文字。如果是,我想将它转换为它代表的字符串,否则我想引发一个错误。是否有更好的方式来完成此任务
# 'x' contains the putative string literal
s = ast.literal_eval(x)
if not isinstance(s, basestring):
raise ValueError("not a valid string literal: " + x)
特别是,由于此字符串的来源,它可能包含复杂对象的repr
,我不想浪费时间解析它然后将其丢弃。
另一种说法是,我希望float
或int
在应用于字符串时的行为,仅适用于字符串。
[注意:现有问题Python convert string literals to strings建议ast.literal_eval
,但这是我希望能够击败的。]
答案 0 :(得分:2)
我认为您可以使用正则表达式。语法上有效的Python字符串是:
''
在一行中包含除'
之外的任何内容,前面有偶数\
""
在一行中包含除\n
"
之外的任何内容,前面有偶数\
""" """
包含除"""
之外的任何内容,前面有偶数\
''' '''
包含除'''
之外的任何内容,前面有偶数\
从理论上讲,你应该能够写一个正则表达式来匹配其中一个,我认为这应该有用。
即使对于复杂的对象,它也可能不会比ast.literal_eval
更快或更好。
现在我考虑一下,你可以这样做:
if x.lstrip().startswith(("'", '"')): #Might be a string
作为预过滤器。