python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配
喵喵时光机
falsetru的嵌套解析器(我稍作修改以接受任意正则表达式模式以指定分隔符和项目分隔符)比我的原始re.Scanner解决方案更快,更简单:import redef parse_nested(text, left=r'[(]', right=r'[)]', sep=r','): """ https://stackoverflow.com/a/17141899/190597 (falsetru) """ pat = r'({}|{}|{})'.format(left, right, sep) tokens = re.split(pat, text) stack = [[]] for x in tokens: if not x or re.match(sep, x): continue if re.match(left, x): # Nest a new list inside the current list current = [] stack[-1].append(current) stack.append(current) elif re.match(right, x): stack.pop() if not stack: raise ValueError('error: opening bracket is missing') else: stack[-1].append(x) if len(stack) > 1: print(stack) raise ValueError('error: closing bracket is missing') return stack.pop()text = "a {{c1::group {{c2::containing::HINT}} a few}} {{c3::words}} or three"print(parse_nested(text, r'\s*{{', r'}}\s*'))产量['a', ['c1::group', ['c2::containing::HINT'], 'a few'], ['c3::words'], 'or three']嵌套结构不能与Python正则表达式匹配的单独的,但它是非常容易建立一个基本解析器使用(其可以处理嵌套结构)re.Scanner:import reclass Node(list): def __init__(self, parent=None): self.parent = parentclass NestedParser(object): def __init__(self, left='\(', right='\)'): self.scanner = re.Scanner([ (left, self.left), (right, self.right), (r"\s+", None), (".+?(?=(%s|%s|$))" % (right, left), self.other), ]) self.result = Node() self.current = self.result def parse(self, content): self.scanner.scan(content) return self.result def left(self, scanner, token): new = Node(self.current) self.current.append(new) self.current = new def right(self, scanner, token): self.current = self.current.parent def other(self, scanner, token): self.current.append(token.strip())可以这样使用:p = NestedParser()print(p.parse("((a+b)*(c-d))"))# [[['a+b'], '*', ['c-d']]]p = NestedParser()print(p.parse("( (a ( ( c ) b ) ) ( d ) e )"))# [[['a', [['c'], 'b']], ['d'], 'e']]默认情况下NestedParser匹配嵌套括号。您可以传递其他正则表达式来匹配其他嵌套模式,例如方括号,[]。例如,p = NestedParser('\[', '\]')result = (p.parse("Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet"))# ['Lorem ipsum dolor sit amet', ['@a xxx yyy', ['@b xxx yyy', ['@c xxx yyy']]],# 'lorem ipsum sit amet']p = NestedParser('', '')print(p.parse("BARBAZ"))# [['BAR', ['BAZ']]]当然,pyparsing可以做的比上面的代码还多。但是出于这个目的,NestedParser对于小型字符串,上述速度要快大约5倍:In [27]: import pyparsing as ppIn [28]: data = "( (a ( ( c ) b ) ) ( d ) e )" In [32]: %timeit pp.nestedExpr().parseString(data).asList()1000 loops, best of 3: 1.09 ms per loopIn [33]: %timeit NestedParser().parse(data)1000 loops, best of 3: 234 us per loop对于较大的字符串,速度要快大约28倍:In [44]: %timeit pp.nestedExpr().parseString('({})'.format(data*10000)).asList()1 loops, best of 3: 8.27 s per loopIn [45]: %timeit NestedParser().parse('({})'.format(data*10000))1 loops, best of 3: 297 ms per loop
python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配相关推荐
- python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构
unutbu.. 14 编辑: falsetru的嵌套解析器,我稍微修改为接受任意正则表达式模式来指定分隔符和项目分隔符,比我原来的re.Scanner解决方案更快更简单: import re def ...
- python用正则表达式判断字符串_使用Python验证常见的50个正则表达式
什么是正则表达式? 正则表达式(Regular Expression)通常被用来检索.替换那些符合某个模式(规则)的文本. 此处的Regular即是规则.规律的意思,Regular Expressio ...
- python 提取pdf表格_用Python提取pdf文件中的表格数据
本文作者:杨慧琳 本文编辑:周聪聪 技术总编:张学人有问题,不要怕!访问 http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx ...
- 如何用python生成表格_用 Python 生成 HTML 表格
在 邮件报表 之类的开发任务中,需要生成 HTML 表格. 使用 Python 生成 HTML 表格基本没啥难度, for 循环遍历一遍数据并输出标签即可. 如果需要实现合并单元格,或者按需调整表格样 ...
- python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...
在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...
- python数字形式转换_在Python中将字母转换为数字
在Python中将字母转换为数字 如何完成以下步骤? characters = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''t''u ...
- [转载] python字符串转有符号数字_在python中将字符串转换为8位带符号整数
参考链接: Python中将十进制转换为字符串 I'm trying to patch together a motor control system using python and ctypes ...
- python字典嵌套字典构造_浅析python 字典嵌套
为什么需要嵌套? 有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 .你可以在列表中嵌套字典.在字典中嵌套列表甚至在字典中嵌套字典. 字典列表 例如:字典alien_0包含 ...
- python 月日年转年月日_在Python中将年/月/日转换为年份
在Python中将年/月/日转换为年份 我正在使用Python的"date时间"模块,即: >>> import datetime >>> to ...
最新文章
- mac 安装mqtt
- eclipse java luna,java-如何在Eclipse Luna中配置Lombok
- 【计算理论】计算复杂性 ( 多项式等价 | P 类 | 丘奇-图灵论题延伸 )
- Centos环境docker的正确安装及疑难杂症
- 关于python2和python3除法的区别
- 在编译内核时出现uudecode错误
- Linux查看c语言组件进程,Linux下查看进程IO工具iopp
- c语言上机题库程序设计,C语言上机程序设计题库及答案.docx
- 重庆曙光服务器虚拟化部署,VMware vCloud Director 安装部署教程
- javascript循环语句及函数
- 运动社交或将成为“反科技”先锋
- php,javascript获取传递各参数的用法
- AD17 保存PCB文件时提示失败
- 【高频电子线路】[笔记]第1章 绪论
- 使用 Visio 绘制卷积示意图
- 修复SQL2000数据库一致性错误的语句
- 人人商城系统安装服务器上,微擎及人人商城安装
- 解决网页文字无法选中或复制
- 【XSY3549】Tree(线段树,换根)
- CSS3选择器及权重
热门文章
- 可控硅g极电阻值计算_可控硅的作用介绍及检测方法
- 【中级软考】两个人同一日就同样的发明创造申请专利,应该授予谁?
- Python 计算机视觉(七)—— OpevCV进行直方图统计
- 计算机应用基础电子毕业考试,计算机应用基础-上海电子信息职业技术学院.PDF...
- 每天学一点儿shell:xargs 命令
- spring启动加载流程
- Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
- php 数学基础,第四章 php数学运算
- QT udp自动获取对方ip和端口号
- mysql maria引擎_MySQL体系结构和存储引擎概述