【问题标题】:Parse text and return list of unmatched brackets in Python在 Python 中解析文本并返回不匹配括号的列表
【发布时间】:2019-01-19 16:50:14
【问题描述】:

我需要解析一些文本并确定哪些括号未闭合并返回将闭合它们的括号列表,例如

如果这是输入的字符串:

({([])

那么函数应该返回一个括号列表来关闭已经不匹配的集合:

['}', ')']

基本上关闭了不匹配的集合。

这是我目前的代码:

def evaluate(str):
stack = []
missing = []
pushChars, popChars = "({[", ")}]"
for c in str:
    if c in popChars:
        matching = pushChars[popChars.index(c)]
        if not len(stack) or stack[len(stack) - 1] != matching:
            missing.append(c)
        else:
            stack.pop()
        continue
    if c in pushChars:
        stack.append(c)
return missing

【问题讨论】:

  • 但是如果你有一个错误的括号序列,比如'({[}'
  • 我会说(对于正在使用的应用程序)它应该返回一个空列表
  • 我在这种情况下添加了引发异常的解决方案。

标签: python python-3.x stack


【解决方案1】:
def evaluate(s):
    stack = []
    result = []
    braces = {'(': ')', '{': '}', '[': ']'}

    for x in s:
        if x in braces.keys():
            stack.append(x)
        elif x == braces[stack[-1]]:
            stack.pop()
        else:
            raise Exception('Non-valid bracket sequence')

    while stack:
        result.append(braces[stack.pop()])

    return result

print(evaluate('({([])'))

输出

['}', ')']

【讨论】:

    【解决方案2】:

    您可以创建一个类来解析文本对,如果没有找到关闭值,则可以将无效字符附加到未关闭的字符列表中:

    class Parse:
      def __init__(self, _str, _to_find = None):
        self.brackets = _str
        self.converter = {'(':')', '[':']', '{':'}', ')':'(', ']':'[', '}':'{'}
        self.search_for = _to_find
        self.flagged = []
        self.parse()
      def parse(self):
        _current = next(self.brackets, None)
        if _current is None and self.search_for is not None:
          self.flagged.append(self.search_for)
        elif _current is not None:
          if _current != self.search_for:
            _result = Parse(self.brackets, self.converter[_current])
            self.flagged.extend(_result.flagged)
            self.brackets = _result.brackets
            self.parse()
    
    
    p = Parse(iter('({([])'))
    print(p.flagged)
    

    输出:

    ['}', ')']
    

    但是请注意,如果找到有效序列,flagged 将是一个空列表 ([]):

    p = Parse(iter('{{()}}'))
    print(p.flagged)
    

    输出:

    []
    

    【讨论】:

    • 所以如果括号序列无效(在上面的评论中解决)它将在标记列表中?
    • @Antidisestablishmentarianism 只有没有结束等价的字符被添加到列表中(如您所需的输出)。
    • 哦,我明白了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多