我的输入数据包含看起来像( 'label', ( 1.0, 2.0, 3.0 ) )
的字符串,也包含像( 'label', #75, #174, #196 )
这样的字符串。可以使用ast.literal_eval()
将前者转换为元组,但是后者失败,因为#xyz条目既不是数字也不是字符串。
我想修改输入字符串以在每个#xyz条目周围加上引号,以使ast.literal_eval()
可以正常工作,即( 'label', '#75', '#174', '#196' )
,或者使用另一个函数来假设不是数字的是字符串,是否带引号。
答案 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)