python括号匹配问题_支持通配符的括号匹配问题源码+详细流程代码(python)

问题:

判断一个有左括号和右括号、以及其他ASCII字符组成的表达式是合法。 判断条件是左括号-右括号数目、次序配对,可多层嵌套。如果有*,则*可作为0个或者1个右括号,如果匹配则输出ok,不匹配则输出不匹配字符所在字符串中的具体位置

示例:

((((***********))(((**           不匹配字符位置:18 结果:NOK

((((***********))(((**))         结果:OK

(()())((()))(()***)                 结果:OK

(()*)                                  结果:OK

*(()*()()*(((*                      不匹配字符位置:12 结果:NOK

(((())))*()(*((**                  结果:OK

((()(())*                            不匹配字符位置:1 结果:NOK

((**)(*())))                        不匹配字符位置:12 结果:NOK

***(((()())**                       结果:OK

(*))                                  不匹配字符位置:4 结果:NOK

()(())*(*)(                          不匹配字符位置:11 结果:NOK

((((******))(((**                  不匹配字符位置:13 结果:NOK

分析:

在字符串中,如果有右括号,则优先匹配右括号,再考虑是否要进行通配符匹配。因此,可以先求出通配符*最少需要多少个才能满足字符串中所有的的左括号匹配,计算公式为:

if  左括号数量 <= 右括号数量://右括号大于等于左括号,不用通配符*替换

max_replace_num=0

else://右括号比左括号少,如果有*则需要用*进行替换右括号

max_replace_num=左括号数量-右括号数量

因括号匹配问题是优先最近原则,因此,可以将左括号入栈,如果遇到右括号,从栈中弹出一个与之匹配,如果遇到通配符*,如果max_replace_num==0则直接跳过,否则先入队列,优先让右括号先进行匹配,等到再碰到下一个左括号时先让队列中的通配符*优先匹配完栈中的左括号,再让左括号入栈。

具体流程图:

详细代码:

def append_list(i,ch):

ch_list = []

ch_list.append(i)

ch_list.append(ch)

return ch_list

def breaket_match(one_str):

'''

:param one_str: 需要匹配的字符串

:return: 返回-1则说明匹配,否则返回不匹配位置

'''

left_len = one_str.count('(') #左括号个数

left_list = [] # 临时存放左括号字符串列表

right_list=[] #保存*的队列

if left_len <= one_str.count(')'): #右括号大于等于左括号,不用*替换

max_replace_num=0

else: #右括号比左括号少,如果有*则需要用*进行替换右括号

max_replace_num=left_len-one_str.count(')') #替换个数为左括号减去右括号个数

for i in range(len(one_str)):

if one_str[i] == '(': #碰到第一个左括号,把标志位设置为false,说明从这里加上进行正式匹配

flag=False

if len(right_list)==0:

left_list.append(append_list(i=i,ch=one_str[i])) #当前左括号和左括号位置入栈

else: #*替换最大可替换个数

k=len(right_list)

tmp_replace = max_replace_num

for j in range(k):

if len(left_list)==0 or j >tmp_replace-1:

break

else:

left_list.pop()

max_replace_num -= 1

right_list.clear()

left_list.append(append_list(i=i, ch=one_str[i])) # 当前*和*位置入栈

elif one_str[i] == ')':#如果当前字符时右括号,出栈

if len(left_list) != 0: # 如果栈中有元素与之匹配,没有元素,说明不匹配,返回位置

left_list.pop()

else:

return i + 1 # 不匹配,返回位置信息

else: #如果当前字符是*

if max_replace_num==0: #判断*是否需要进行右括号匹配,为0说明不需要进行替换

pass

else: #*需要替换为右括号

if len(left_list)!=0 : #如果栈中有元素与之匹配,没有元素,说明不匹配,返回位置,并且替*换个数-1

right_list.append(append_list(i=i, ch=one_str[i])) # 左括号和左括号位置入栈

else: #如果左括号个数为0,但是下一个与之匹配的为*,则跳过

pass

k = len(right_list)

tmp_replace=max_replace_num

for i in range(k):

if len(left_list) == 0 or i > tmp_replace-1:

break

else:

left_list.pop()

max_replace_num -= 1

if (len(left_list)!=0): #如果左括号栈中元素不为空,不匹配,返回位置信息

return left_list.pop()[0]+1

else:

return -1 #匹配,返回-1

def read_file(file_path):

'''

读取文件

:param file_path:

:return: 返回list集合,里面包含文件每一行的字符

'''

lines = []

try:

file = open(file_path) #打开文件

line = file.readline() #读取文件第一行

while 1:

line = line.strip('\n') #去掉换行符\n

lines.append(line) #把文件的每一行append到lines里面

line = file.readline()

if not line:

file.close()

break

except :

print("打开文件失败,请确认文件名和路径是否正确!")

return lines

def main():

# print("请输入文本文件路径:")

#读取文件

# filepath=input() #读取控制台谁的文件路径

lines=read_file("test.txt")

length_lines=len(lines)

#breaket_match(str)输入参数str为需要匹配的字符串,如果匹配成功,则返回true,如果匹配不成功,则返回false

file=open("result.txt","w")

for i in range(length_lines): #对读取出来的文件每一行进行匹配

result=breaket_match(one_str=lines[i])

if result==-1:

file.write("行号:第"+str(i+1)+"行; "+"源字符串:"+lines[i]+"; "+"结果:"+"OK"+"\n")

print("行号:第"+str(i+1)+"行; "+"源字符串:"+lines[i]+"; "+"结果:"+"OK")

else:

file.write("行号:第" + str(i+1) + "行; " + "源字符串:" + lines[i] + "; " +"不匹配字符位置:"+str(result)+ " 结果:" + "NOK"+"\n")

print("行号:第" + str(i+1) + "行; " + "源字符串:" + lines[i] + "; " +"不匹配字符位置:"+str(result)+ " 结果:" + "NOK")

file.close()

if __name__ == '__main__':

main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译选项—微软官方+各地总结

优化选项用途/O1创建小代码。/O2创建快速代码。/Ob控制内联展开。/Od禁用优化。/Og使用全局优化。/Oi生成内部函数。/Os代码大小优先。/Ot代码速度优先。/Ox使用最大优化 (/Ob2gity /Gs)。/Oy省略帧指针。 (仅限 x86)代码生成选项用途/arch使用 SSE 或 SSE2 指令生成代码。 (仅…

(原创)让mongodb的secondary支持读操作

对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中&#xff0c;使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk&#xff0c;由Secondary来分担读的压力&#xff0c;Primary只承担写操作。如果通过shell访问mongo&#xff0c;要在…

全国计算机等级考试题库二级C操作题100套(第67套)

第67套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;调用随机函数产生20个互不相同的整数放在形参a所指数组中&#xff08;此数组在主函数中已置0&#xff09;。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意&#xff1a…

mx4 pro 刷 原生 android,魅族MX4 Pro怎么刷机?通用刷机和固件升级教程

魅族MX4 Pro是一款性价比很高的手机&#xff0c;使用这款手机的用户也非常多。不过在魅族MX4 Pro的使用过程中&#xff0c;难免会出现系统方面的问题&#xff0c;又或者官方发布了新的固件升级包&#xff0c;这个时候就需要通过刷机的方法来解决问题或者升级魅族MX4 Pro固件。在…

python dataframe 查看为空值_Python pandas.DataFrame 找出有空值的行

0.摘要pandas中DataFrame类型中&#xff0c;找出所有有空值的行&#xff0c;可以使用.isnull()方法和.any()方法。1.找出含有空值的行方法&#xff1a;DataFrame[DataFrame.isnull().T.any()]其中&#xff0c;isnull()能够判断数据中元素是否为空值&#xff1b;T为转置&#xf…

#linux# su命令细节错误

2019独角兽企业重金招聘Python工程师标准>>> #前言# 在学习su命令时&#xff0c;几乎所有的国内书籍都说是切换用户功能。今天在linux系统下想开启httpd&#xff08;即Apache服务器&#xff09;&#xff0c;输入指令<code>service httpd start</code>结…

ASP.NET MVC5+EF6+EasyUI 后台管理系统(92)-打印EasyUI 的datagrid表格

前言 应用系统有时候需要打印Datagrid的表格内容&#xff0c;我们本节就来学习打印datagrid内容 打印主要使用&#xff1a;web打印&#xff08;我们之前有讲过web打印插件jqprint&#xff09; 将datagrid重新编制成可以打印的html格式 一、建立一个普通的例子 我们使用官方下载…

全国计算机等级考试题库二级C操作题100套(第68套)

第68套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求ss所指字符串数组中长度最长的字符串所 在的行下标,作为函数值返回&#xff0c;并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并…

速读训练软件_记忆宫殿记忆力训练教程-第八天

第四部分 右脑开发及训练前面我们已经知道了右脑的记忆能力是左脑的100万倍&#xff0c;这可不是个小数字&#xff0c;如果我们能利用右脑来处理眼睛所收集到的信息&#xff0c;我们的记忆能力就会达到每分钟数万字的超级速度右脑不同于左脑的四种能力为&#xff1a;1、共振能力…

uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示

引用的网络图片&#xff0c;ios显示空白&#xff0c;banner自动切换的图片content:,state:0,imgUrls: ["https://m.360buyimg.com/n12/jfs/t11317/108/1080677336/325163/f4c2a03a/59fd8b17Nbe2fcca3.jpg!q70.jpg","https://m.360buyimg.com/n12/jfs/t11575/282…

Razor语法

原文 http://www.cnblogs.com/lmfeng/archive/2013/03/28/2986073.html Razor语法概要&#xff1a; 1、Razor是以为标识符 2、是以{}作为作用域的标识 3、可以按照一定规则将HTML和C#混合编写 4、若输出要使用进行转义 { Layout "~/_SiteLayout.cshtml"; Page.Titl…

mysql 随机选取一条记录

要从tablename表中随机提取一条记录&#xff0c;大家一般的写法就是&#xff1a;SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mysql> SELECT RAND(); ------------------- |…

全国计算机等级考试题库二级C操作题100套(第69套)

第69套&#xff1a; 给定程序中&#xff0c;函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数&#xff0c;并进行相加作为函数值返回&#xff0c;规定字符串中只含9个以下数字字符。 例如&#xff0c;主函数中输入字符串&#xff1a;32486和12345&#xff0c;在主函…

python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)

①安装PIL&#xff1a;pip install Pillow(之前的博客中有写过)②安装pytesser3&#xff1a;pip install pytesser3③安装pytesseract&#xff1a;pip install pytesseract④安装autopy3&#xff1a;先安装wheel&#xff1a;pip install wheel下载autopy3-0.51.1-cp36-cp36m-wi…

android基于蓝牙实验,基于Android智能蓝牙的血糖实时监测系统的设计与实现

摘要&#xff1a;糖尿病是目前严重危害人类健康的一种疾病,掌握血糖的变化是现阶段临床上预防和控制糖尿病最重要也是最有效的方法。目前市场上已有的血糖仪大部分是以电化学方法为基础,将检测结果保存到检测仪器中,不利于对数据进行相关分析。论文基于嵌入式检测技术与Android…

[Vue]组件——通过$emit为组件自定义事件

1.在定义组件时调用内建的 $emit 方法并传入事件的名字&#xff0c;来向父级组件触发一个事件enlarge-text&#xff1a; Vue.component(blog-post, {props: [post],template: <div class"blog-post"><h3>{{ post.title }}</h3><button v-on:cli…

全国计算机等级考试题库二级C操作题100套(第70套)

第70套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;计算形参x所指数组中N个数的平均值&#xff08;规定所有数均为正数&#xff09;,作为函数值返回&#xff1b;并将大于平均值的数放在形参y所指数组中, 在主函数中输出。 例如&#xff0c;有10个正数&…

浅谈mysql的子查询

2019独角兽企业重金招聘Python工程师标准>>> mysql的子查询的优化一直不是很友好&#xff0c;一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一&#xff0c;mysql在处理子查询的时候&#xff0c;会将子查询改写,通常情况下&#xff0c;我们希望由内到…

选择符合语义的html标签,最容易犯的HTML标签错误写法

我们最好开始注意了,因为HTML Police会走遍你的代码然后挑出你所有没有语义的标签,这份列表包含了10个最经常犯得HTML标签错误,记下他们,能够让我们避免犯此常见错误,让我们的HTML标签符合语义,和标准的要求.罪行1:把块级元素放入了行内元素内HTML 元素的表现方式不外乎就两种:…

python装饰器参数讲解_python装饰器的详细解析

写在前面:python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数&#xff0c;目的是在不改变原函数名(或类名)的情况下&#xff0c;给函数增加新的功能。 这个函数的特殊之处在于它的返回值也是一个函数&#xff0c;这个函数是内嵌“原“”函数的函数。一般而…