[英]How to recursively remove the first set of parantheses in string of nested parantheses? (in Python)
編輯:假設我有一串嵌套的括號,如下所示:((AB)CD(E(FG)HI((J(K))L)))(假設括號是平衡的並正確括起來如何遞歸刪除全封閉括號的每個子集的第一組全封閉括號?
所以在這種情況下將是 (ABCD(E(FG)HI(JK)). (AB) 將變成 AB 因為 (AB) 是一組閉括號中的第一組閉括號(從 (AB) 到 K) ),E 也是括號集合的第一個元素,但由於它沒有括號,因此沒有任何更改,並且 (J) 是集合 ((J)K) 中的第一個元素,因此括號將被刪除。
這類似於構建表達式樹,到目前為止我已將其解析為嵌套列表,並認為我可以遞歸檢查每個嵌套列表的第一個元素是否為instance(type(list)),但我不知道如何?
嵌套列表如下:
arr = [['A', 'B'], 'C', 'D', ['E', ['F', 'G'], 'H', 'I', [['J'], 'K']]]
也許將其轉換為:
arr = [A, B, C, D, [E, [F, G], H, I, [J, K]]
有沒有更好的辦法?
您需要將邏輯簡化為足夠清晰的內容以進行編程。 我從你的解釋中得到的信息看起來像下面的代碼。 請注意,我還沒有處理過邊緣情況:您需要檢查 None 元素,點擊列表的末尾等。
def simplfy(parse_list):
# Find the first included list;
# build a new list with that set of brackets removed.
reduce_list = []
for pos in len(parse_list):
elem = parse_list[pos]
if isinstance(elem, list):
# remove brackets; construct new list
reduce_list = parse_list[:pos]
reduce_list.extend(elem)
reduce_list.extend(parse_list[pos+1:]
# Recur on each list element
return_list = []
for elem in parse_list
if isinstance(elem, list):
return_list.append(simplfy(elem))
else:
return_list.append(elem)
return return_list
如果我正確理解了這個問題,這個丑陋的函數應該可以解決問題:
def rm_parens(s):
s2 = []
consec_parens = 0
inside_nested = False
for c in s:
if c == ')' and inside_nested:
inside_nested = False
consec_parens = 0
continue
if c == '(':
consec_parens += 1
else:
consec_parens = 0
if consec_parens == 2:
inside_nested = True
else:
s2.append(c)
s2 = ''.join(s2)
if s2 == s:
return s2
return rm_parens(s2)
s = '((AB)CD(E(FG)HI((J)K))'
s = rm_parens(s)
print(s)
請注意,此函數將遞歸調用自身,直到不存在連續的括號。 但是,在您的示例 ((AB)CD(E(FG)HI((J)K))) 中,一次調用就足以產生 (ABCD(E(FG)HI(JK))。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.