问题:

判断一个有左括号和右括号、以及其他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()

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

  1. python检测屏幕亮点_图像处理之坏点校正及源码实现

    1 坏点介绍 图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素信息错误,导致图像中的像素 ...

  2. 深度学习算法--python实现用TensorFlow构建字符级RNN语言建模(源码+详细注释)

    语言建模是一个迷人的应用,它使机器能完成与人类语言相关的任务,如生成英语句子.现在要构建的模型中,输入为文本文档(纯文本格式的威廉·莎 士比亚的悲剧<哈姆雷特>),目标是研发可以生成与输入 ...

  3. AidLux“换脸”案例源码详解 (Python)

    "换脸"案例源码详解 (Python) faceswap_gui.py用于换脸,可与facemovie_gui.py身体互换源码(上一篇文章)对照观看 打开faceswap_gui ...

  4. Python基于改进YOLOv5的烟叶病害检测系统(附带源码)

    Python基于改进YOLOv5的烟叶病害检测系统(附带源码) 1.背景 2.前言 3.烟叶数据集的采集 4.烟叶数据集的标注 5.烟叶检测训练&识别效果 6.病害数据集的采集 7.病害数据集 ...

  5. datax源码阅读一:python文件

    一.前面主要是怎么使用datax和datax的插件编写,后面主要说明源码阅读部分,python相关文件 二.datax关键代码(python datax.py test.json) 1.datax.p ...

  6. Python源码学习笔记:Python程序执行过程与字节码

    Python程序执行过程与字节码 注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除. 问题: 我们每天都要编写一些Python程 ...

  7. Python基于CycleGAN&pix2pix的黑白图像AI上色(源码&部署教程)

    1.项目背景 自从GAN技术发展以来,许多新奇的应用都得到了落地,本次我们来介绍其中一个小应用,就是黑白图像上色.想必大家在网上经常看到一些给黑白图像上色的视频,可以修复早期的黑白影像,背后的技术就是 ...

  8. python爬取豆瓣读书top250并保存xls(含源码)

    python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...

  9. 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库

     源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...

最新文章

  1. 数字通信介绍(5)什么是MIMO?
  2. MATLAB的var与std函数 与 均值,方差,标准差,均方差,均分误差
  3. keil5建立多文件的时候为什么总是出错
  4. Android Hook Java的的一个改进版本
  5. 结对编程前对队友程序的分析与对比总结
  6. 联想小新系列win10系统使用IDEA经常闪退,蓝屏,死机,饱受折磨
  7. java.lang.ExceptionInInitializerError
  8. [问题解决]基于注解配置dubbo遇到ConnectionLoss for /dubbo/xxx问题解决
  9. 计算机专业课的教学准备,计算机专业课程教学中的分层教学模式
  10. 微信小程序网络通信(一)
  11. html中注释有几种_历史尝试:小白HTML学习笔记(2)
  12. 基姆拉尔森计算公式(算任意日期是星期几)
  13. oracle 算年级,oracle 查询年级,班级,班级人数;
  14. 数据库:数据导入/数据导出
  15. 信捷plc编程100例梯形图_PLC分类组成与梯形图编程语言
  16. cadence SPB17.4 - 保存和恢复颜色配置
  17. 激光测距传感器原理与应用介绍
  18. 纯屏和液晶显示器有什么区别
  19. 关于K fold交叉验证
  20. Matlab+cpp矩量法代码演示

热门文章

  1. unable to execute dex: multiple dex files Cocos2dxAccelerometer
  2. [算法]不用第三个数交换2个数的位置
  3. 每天一个linux命令(9):nl命令
  4. JOSSO在JBOSS中安装与配置
  5. 【转】关于WaterFall瀑布流式布局的性能优化
  6. IOS静态库生成及测试
  7. 巴科斯范式BNF: Backus-Naur Form介绍
  8. pyinstaller打包执行exe出现“ModuleNotFoundError: No module named ‘scipy.spatial.transform._rotation_group”
  9. 深度学习之pytorch(二) 数据并行
  10. 小说里的lt什么意思_游戏cpdd网络用语是什么意思 王者荣耀里很常见