如何从几乎看起来像元组但包含未引用文本的字符串创建元组?

时间:2019-06-06 17:11:27

标签: python

我的输入数据包含看起来像( 'label', ( 1.0, 2.0, 3.0 ) )的字符串,也包含像( 'label', #75, #174, #196 )这样的字符串。可以使用ast.literal_eval()将前者转换为元组,但是后者失败,因为#xyz条目既不是数字也不是字符串。

我想修改输入字符串以在每个#xyz条目周围加上引号,以使ast.literal_eval()可以正常工作,即( 'label', '#75', '#174', '#196' ),或者使用另一个函数来假设不是数字的是字符串,是否带引号。

2 个答案:

答案 0 :(得分:0)

  

我想修改输入字符串以将引号引起来   每个#xyz条目,以便ast.literal_eval()可以正常运行,即(''label',   '#75','#174','#196')

使用re.sub用引号内的数字替换#N:

>>> a = "( 'label', #75, #174, #196 )"
>>> a
"( 'label', #75, #174, #196 )"
>>> re.sub(r"#(\d+)", r"'#\1'", a)
"( 'label', '#75', '#174', '#196' )"

答案 1 :(得分:0)

您可以编写一个递归函数,以考虑括号分组的情况下从逗号之间的值构建元组:

例如:

s1 = "( 'label',  ( 1.0, 2.0, 3.0 ) )"
s2 = "( 'label', #75, #174, #196, 37 )"

def str2Tuple(s):
    if "(" not in s and "," not in s:
        try :   value = int(s) if s.isdigit() else float(s)
        except: value = s.strip("'")
        return value
    result      = []
    group,value = 0,""
    for c in s+",":
        if c == "," and group == 0:
            result.append(str2Tuple(value.strip()))
            value = "";continue
        group -= c==")"
        if group>0 or c not in "()": value += c
        group += c=="("
    return tuple(result) if len(result)>1 else result[0]

print(str2Tuple(s1)) # ('label', (1.0, 2.0, 3.0))
print(str2Tuple(s2)) # ('label', '#75', '#174', '#196', 37)