通过平衡括号解析并获取对应的元素

Parsing through balanced parenthesis and obtaining corresponding elements

我基本上要处理类似 平衡圆括号 的问题,但略有不同。 我需要读取一个看起来像这样的文件(一个文件中只有 2 行):

aguuguuagucuacguggaccgacaagaacaguuucgaaucggaagcuugcuuaacguaguucuaacaguuuuuuauuag agagcagaucucugaugaacaaccaacgaaaaaagacgggucgaccgucuuucaauaugcugaaac
...((((((.((((((...((((...(((....)))...)))(((....))).))))))..)))))).........((((((.....))))))..................(((((((.....))))))).................

如您所见,每个字母都有对应的“(”或“)”或“.”与之相关的是,所有括号都是平衡的,但它们是嵌套的。与公式一样,每个“(”和“)”表示顶部有一对对应的字母。

例如:如果“(”在其上方有字母表 "a",而相应的“)”{使其平衡}在其上方有一个 "u",表示存在 "a"-"u" 配对。这 ”。”意味着这些字母表没有配对。这样我需要创建所有对的完整映射并将其写入新文件。

在所有情况下,"a" 与 "u" 配对,"g" 与 "c" 配对。

我正在考虑将其分解为更小的平衡括号块并将其转换为数组,但我发现很难同时解析这两行。虽然我以前写过检查平衡括号的程序,但我似乎无法想出一个逻辑来将每个括号映射到上面的字母表并将其与相应括号的字母表配对。

如果有人能帮我大致概述一下,我将不胜感激,因为我确实没有取得任何实质性进展。

编辑:我需要每组平衡括号的输出如下所示:

Input: gaacaguuuc
       (((....)))

Output: cagu have no pairs //because they have dots underneath
        g-c 
        a-u
        a-u

我肯定不是 py wizz。但这是我对你的问题的解决方案,据我所知。

inp1 = "agucagcguagcugaucguga"
inp2 = "(..(((...(()).)...)))"

bkts = []
nomatch = []
pairs = []

for idx in range(len(inp2)):
    c = inp2[idx];
    if c == '(':
        bkts.append(inp1[idx])
    elif c == '.':
        nomatch.append(inp1[idx])
    elif c == ')':
        if len(bkts) > 0:
            pair = [bkts.pop(), inp1[idx]]
            pairs.append('-'.join(pair))
        else :
            print "error: Too many closing bkts"

if len(bkts) > 0 :
    print "Unmatched brackets! Too many open"

print "unmatched: " + ','.join(nomatch)
print "matches: " + ','.join(pairs)