Python 将一组元组转换为值

Python 将一组元组转换为值,python,string,parsing,nlp,eval,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'), ('C

我正在做一个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')}
我尝试使用literal_eval per,但出现无效语法错误。我认为这是因为标记是一个集合,其中包含元组,其中包含未转换为字符串的字符串,所以文本值会混淆(这里只是猜测)


我试着做了一些bandaid-y字符串条带和拆分,但我找不到一个能对不同标签动态工作的解决方案。

您可以使用正则表达式:

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')])

我会这样做:

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的步骤遍历列表,删除奇数元素的第一个字符(
)和偶数元素的最后一个字符(
)。我将生成的元组附加到一个新列表中。

如果标记包含逗号、括号怎么办?首先正确地生成列表不是更简单吗?标记将始终采用相同的形式:一组包含两个值的元组。另一个标记示例是[]中的“{(所有年龄,S),($,S),(Alternative&Rock,S),(Concerts&Live Music,P)}”:我会尝试先用逗号拆分,然后加入对。请发布您的代码,这样我们就可以从那里开始这项工作,但对于带有单个标记的字符串,不会返回任何内容。例如,“{(音乐会和现场音乐,P)}”