有没有一种简单的方法将包含字符串文字的字符串转换为它代表的字符串?

时间:2012-01-05 06:18:54

标签: python

我正在尝试(稍微)改进一个脚本,该脚本对某些配置文件进行快速而苛刻的解析。

在识别出从文件中读取的“项目”时,我需要尝试将其转换为简单的python值。值可以是数字或字符串。

要将从文件中读取的字符串转换为Python数字,我可以使用intfloat并捕获ValueError(如果它实际上不是数字)。 Python字符串有类似的东西吗?即。

s1 = 'Goodbye World. :('
s2 = repr(s1)
s3 = '   "not a string literal"    '
s4 = s3.strip()

v1 = parse_string_literal(s1) # throws ValueError
v2 = parse_string_literal(s2) # returns 'Goodby World. :('
v3 = parse_string_literal(s3) # throws ValueError
v4 = parse_string_literal(s4) # returns 'not a string literal'

在文件中,字符串值的表示方式与Python字符串文字非常相似;它们可以用'或'引用,并且可以包含反斜杠转义等。我可以用正则表达式滚动我自己的解析器,但是如果已经存在某些东西我宁愿不重新发明轮子。

我当然可以使用eval,但这总是有些危险。

2 个答案:

答案 0 :(得分:4)

......果然,我刚发布后就找到了答案。

甚至比我想要的更好ast.literal_evalast — Abstract Syntax Trees

它可以评估任何仅由文字组成的Python表达式,这样可以确保安全。这也意味着我可以识别配置文件中可能是数字或字符串的项目,而无需尝试多次转换,然后回到ValueError异常的下一次转换。我甚至不需要弄清楚该项目的类型。

它甚至比我需要的更灵活,如果我关心确保该项只是只是一个数字或一个字符串,这可能是一个问题,但我不这样做:

>>> ast.literal_eval('{"foo": [23.8, 170, (1, 2, 3)]}')
{'foo': [23.8, 170, (1, 2, 3)]}

答案 1 :(得分:2)

ast.literal_eval()处理所有简单的Python文字和大多数复合文字。