歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用Python列表實現括號匹配

用Python列表實現括號匹配

日期:2017/3/1 9:06:29   编辑:Linux編程

假設我們有一些復雜的表達式,裡邊包含了多種括號的嵌套,這個時候去肉眼判斷括號匹配是一件非常令人蛋疼的事情,那麼,怎麼用Python來進行基本的判斷呢,答案很簡單,就是用python中的list來模擬棧結構進行判斷。
舉個例子來說加入我們的文件中有類似一下多重嵌套的算式:

rows = [
'([<^>x[ ]{a}]{/}{t}g<^>)<{x}b>{x}<z({%}w >[b][c[c]]{<h>{h}}',
 '[/]{((x)({{*}*}w)w){f}{v}[%(^[z]{u}{ })([[ ]-]h)]{c}(*)[y]}',
 '<<(^)z>>[b]< >[[(c)u[v]{z<b< >><b>}]g][/b[(])v(v)(+)](v)',
 '[[b]][(v)g]<z>([{{<->+}e}[*]d<+>]g[[a] <+>(v){b}<e>]){a}[u]',
 '<h>(({-}b}a>)[(v)b]+(e{g})( )){< >(t[f])[w](f)<',
 '[^](<g{+}>[f{t}](d){x}^))%}<+{ (f)}>{}[ (u{]{{{d}^}x}',
 '((%)(f)[e][b[%][*]]u)([h] c})<b>[w]{<t>(/)(d)< >[%]%}',
 '<c>[w][[<t>+]]<{(t)a}d({<v>y<^{-}>}b)><w>{{%}^}',
 'b[u]<%>(%)(w))[y]{[u(f)]f< >}[<(>+]<w>(((<z> )(c)(b[w])/){ }h< >)',
 '([ ])<y><({{f}d}a(b)){/}*>{^}(/{h}{t[+]{t{b}}{x}[y]})',
 '< {^}>{+}{[a[e]]<z<^><%>{h}>{y}{(/((t a(t)))*( )}<a>( )}',
 '(<h>(<[d]g>(d)/c]<d>(d)[)(<[^]h>c)(<b> )){c}(b){ }',
 '{(h)[t][y]{%}{e}*(d)[*]}(e)<<(>{t}(z<+>)<[*]t>-(w)><-b)><[c]d[ ]>',
 '<a>{<(^)<h>c>[f]<h>{{v}y[/]}}((w{h})f)<{+}e( )>[t{w}]',
 '([v<%>>/)[+]<t]<<%>b>(({a<[x]*>{+[^]}}[w]h)< >)(h)',
 '<((*)f)((g(w[ [*]]))w{<y>+}(^))>{g}{+}{t}(h)',
 '<b><{{+}c{{(x)[x]f}^(^)}}[f](%)[u][u]<v>{<[z]e>f(g[%])}>',
 '[<<(+)( )y<*[u]>> ><h>[{ <y{v}>}^[c< >]{g}]<f><->[c<v>](/<z>)][t]',
 '(u[/])< >{e}<->{-}(( )[f]%)(d)[][[x[y]]t]{ {d{x}[t]}}{(b)x[z]}'
 ]

我們要做的就是給一個基本的判斷,看裡邊的括號是不是匹配正確,我們可以用一下程序經行判斷

# 存儲左括號和又括號
open_brackets = '([{<'
close_brackets = ')]}>'
# 映射左右括號便於出棧判斷
brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}

# 對於沒一行數據,進行如下判定若括號為左括號,加入棧,若括號為右括號,判斷是否跟棧尾括號對應,若對應,彈出棧尾元素,若所有括號均正確閉合,則最後棧為空。
for row in rows:
    stack = []
    label = True
    for char in row:
        if char in open_brackets:
            stack.append(char)
        elif char in close_brackets:
            if len(stack) < 1:
                label = False
                break
            elif brackets_map[char] == stack[-1]:
                stack.pop()
            else:
                label = False
                break
        else:
            continue
    if stack != []:
        label = False
    print label,

簡單解釋一下上邊代碼,首先我們把各種括號的開始端和閉合端分開,作為出入棧的判定依據,然後將相應的括號對應起來以便判斷。接下來我們對沒一行進行括號的出入棧檢驗,只有滿足條件的最後才能被判定為所有括號都閉合。

零基礎如何入門Python http://www.linuxidc.com/Linux/2016-10/136485.htm

Ubuntu 14.04安裝Python 3.3.5 http://www.linuxidc.com/Linux/2014-05/101481.htm

CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

在CentOS 6.5上安裝Python2.7 http://www.linuxidc.com/Linux/2016-10/136206.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Copyright © Linux教程網 All Rights Reserved