喵喵时光机

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中将嵌套结构与正则表达式匹配相关推荐

  1. python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构

    unutbu.. 14 编辑: falsetru的嵌套解析器,我稍微修改为接受任意正则表达式模式来指定分隔符和项目分隔符,比我原来的re.Scanner解决方案更快更简单: import re def ...

  2. python用正则表达式判断字符串_使用Python验证常见的50个正则表达式

    什么是正则表达式? 正则表达式(Regular Expression)通常被用来检索.替换那些符合某个模式(规则)的文本. 此处的Regular即是规则.规律的意思,Regular Expressio ...

  3. python 提取pdf表格_用Python提取pdf文件中的表格数据

    本文作者:杨慧琳 本文编辑:周聪聪 技术总编:张学人有问题,不要怕!访问 http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx ...

  4. 如何用python生成表格_用 Python 生成 HTML 表格

    在 邮件报表 之类的开发任务中,需要生成 HTML 表格. 使用 Python 生成 HTML 表格基本没啥难度, for 循环遍历一遍数据并输出标签即可. 如果需要实现合并单元格,或者按需调整表格样 ...

  5. python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  6. python数字形式转换_在Python中将字母转换为数字

    在Python中将字母转换为数字 如何完成以下步骤? characters = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''t''u ...

  7. [转载] python字符串转有符号数字_在python中将字符串转换为8位带符号整数

    参考链接: Python中将十进制转换为字符串 I'm trying to patch together a motor control system using python and ctypes ...

  8. python字典嵌套字典构造_浅析python 字典嵌套

    为什么需要嵌套? 有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 .你可以在列表中嵌套字典.在字典中嵌套列表甚至在字典中嵌套字典. 字典列表 例如:字典alien_0包含 ...

  9. python 月日年转年月日_在Python中将年/月/日转换为年份

    在Python中将年/月/日转换为年份 我正在使用Python的"date时间"模块,即: >>> import datetime >>> to ...

最新文章

  1. mac 安装mqtt
  2. eclipse java luna,java-如何在Eclipse Luna中配置Lombok
  3. 【计算理论】计算复杂性 ( 多项式等价 | P 类 | 丘奇-图灵论题延伸 )
  4. Centos环境docker的正确安装及疑难杂症
  5. 关于python2和python3除法的区别
  6. 在编译内核时出现uudecode错误
  7. Linux查看c语言组件进程,Linux下查看进程IO工具iopp
  8. c语言上机题库程序设计,C语言上机程序设计题库及答案.docx
  9. 重庆曙光服务器虚拟化部署,VMware vCloud Director 安装部署教程
  10. javascript循环语句及函数
  11. 运动社交或将成为“反科技”先锋
  12. php,javascript获取传递各参数的用法
  13. AD17 保存PCB文件时提示失败
  14. 【高频电子线路】[笔记]第1章 绪论
  15. 使用 Visio 绘制卷积示意图
  16. 修复SQL2000数据库一致性错误的语句
  17. 人人商城系统安装服务器上,微擎及人人商城安装
  18. 解决网页文字无法选中或复制
  19. 【XSY3549】Tree(线段树,换根)
  20. CSS3选择器及权重

热门文章

  1. 可控硅g极电阻值计算_可控硅的作用介绍及检测方法
  2. 【中级软考】两个人同一日就同样的发明创造申请专利,应该授予谁?
  3. Python 计算机视觉(七)—— OpevCV进行直方图统计
  4. 计算机应用基础电子毕业考试,计算机应用基础-上海电子信息职业技术学院.PDF...
  5. 每天学一点儿shell:xargs 命令
  6. spring启动加载流程
  7. Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
  8. php 数学基础,第四章 php数学运算
  9. QT udp自动获取对方ip和端口号
  10. mysql maria引擎_MySQL体系结构和存储引擎概述