2017-10-17 99 views
2

我正在處理一個需要解析標籤的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字符串條和分割,但我無法得到一個解決方案,將動態地爲不同的標籤。

+0

如果標籤包含逗號,括號?首先要正確生成列表不是更簡單嗎? –

+0

標籤將始終採用相同的形式:一組包含兩個值的元組。另一個標記示例是'{(All Ages,S),($,S),(Alternative&Rock,S),(Concerts&Live Music,P)}' In []: – Daniel

+0

我會嘗試首先逗號然後加入成對。 – Adirio

回答

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

這可以工作,但對於帶有單個標籤的字符串沒有任何返回。例如,'{(音樂會和現場音樂,P)}' – Daniel

+0

@Daniel現在再試一次代碼。 – Ajax1234

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]刪除第一個和最後一個字符({ & }),然後用逗號分隔。然後我每個部分都刪除初始和最終的空格。最後我遍歷整個列表,步驟爲2,刪除奇數元素的第一個字符(()和偶數元素的最後一個字符())。我將結果元組追加到一個新列表中。