将一组元组转换为值

时间:2017-10-17 14:31:19

标签: python string parsing nlp eval

我正在研究一个我需要解析标签的nlp项目。我有以下形式的多个标签:一个字符串,它是一组元组。例如:

'{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'

但我希望它看起来像这样:

{('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S'), ('Plays & Shows', 'P')}

我尝试每this question使用literal_eval,但是语法错误无效。我认为这是因为标签是一个集合,其中包含元组,其中包含不作为字符串强制转换的字符串,因此literal_eval会混淆(只是在这里猜测)。

我尝试过一些bandaid-y字符串和分割,但是我无法获得一个可以为不同标签动态工作的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式:

import re
s = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
final_data = [re.split(",\s+", i) for i in re.findall("\((.*?)\)", s)]
final_data = [[re.sub("\(|\)", '', b) for b in i] for i in final_data]
new_final_data = set(map(tuple, final_data))

输出:

set([('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S')])

答案 1 :(得分:1)

我会这样做:

original = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'

splited = original[1:-1].split(',')

splited = list(map(lambda x: x.strip(), splited))

grouped = []

for i in range(0, len(splited), 2):
    grouped.append((splited[i][1:], splited[i+1][:-1]))

print(grouped)

使用您喜欢的变量名称。我首先使用[1:-1]删除第一个和最后一个字符({& }),然后用逗号分隔。然后我.strip()每个部分删除初始和最终的空格。最后,我以2的步长迭代列表并删除奇数元素的第一个字符(()和偶数元素的最后一个字符())。我将生成的元组添加到新列表中。