【问题标题】:Convert string literal to string or raise error, Python将字符串文字转换为字符串或引发错误,Python
【发布时间】:2013-11-12 22:25:05
【问题描述】:

我有一个字符串,它可能包含也可能不包含语法上有效的 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,我不想浪费时间解析它然后把它扔掉。

另一种说法是,我希望 floatint 在应用于字符串时的行为,仅适用于字符串。

[注意:现有问题Python convert string literals to strings 推荐ast.literal_eval,但这是我希望能够击败的。]

【问题讨论】:

  • 你可以通过 if x[0]==x[-1] and x[0] in '\'"' 稍微短路它,但我认为这可能和它一样好

标签: python parsing python-2.x


【解决方案1】:

我认为您可以使用正则表达式。一个语法上有效的 Python 字符串是:

  • '' 在包含除 ' 之外的任何内容的一行上,前面是偶数个 \
  • "" 在包含除 \n 以外的任何内容的一行上 " 前面是偶数个 \
  • """ """ 包含除 """ 之外的任何内容,前面有偶数个 \
  • ''' ''' 包含除 ''' 之外的任何内容,前面有偶数个 \

从理论上讲,您应该能够编写一个正则表达式来匹配其中一个,我认为这应该可行。

它可能不会比ast.literal_eval 更快或更好,即使是复杂的对象。

现在我想了想,你可以这样做:

if x.lstrip().startswith(("'", '"')): #Might be a string

作为预过滤器。

【讨论】:

  • @JonClements,这就是为什么我更新我的答案说它可能不会比ast.literal_eval 快;)
  • @JonClements,啊,是的,我对 Python 的使用还不够——我一直忘记你可以通过这种方式传递集合。
  • 这就是我在回家之前尝试编辑的结果;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2013-03-02
  • 1970-01-01
  • 2019-01-05
  • 2012-05-16
相关资源
最近更新 更多