unutbu..

14

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

import re

def parse_nested(text, left=r'[(]', right=r'[)]', sep=r','):

""" /sf/ask/17360801/ (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 re

class Node(list):

def __init__(self, parent=None):

self.parent = parent

class 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 pp

In [28]: data = "( (a ( ( c ) b ) ) ( d ) e )"

In [32]: %timeit pp.nestedExpr().parseString(data).asList()

1000 loops, best of 3: 1.09 ms per loop

In [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 loop

In [45]: %timeit NestedParser().parse('({})'.format(data*10000))

1 loops, best of 3: 297 ms per loop

python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构相关推荐

  1. python中if嵌套语句_讲解Python中if语句的嵌套用法

    可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...

  2. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  3. python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配

    喵喵时光机 falsetru的嵌套解析器(我稍作修改以接受任意正则表达式模式以指定分隔符和项目分隔符)比我的原始re.Scanner解决方案更快,更简单:import redef parse_nest ...

  4. python中if else语句用法_讲解Python中if语句的嵌套用法

    可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...

  5. python中的正则表达式是干嘛的_操作python中的正则表达式(上)

    上次的爬虫最终获取了马蜂窝旅行评论页面的全部内容,其实很多都是无用信息,我们要进行筛选清洗,这就用到了正则表达式,在写爬虫后续之前先大概搞一下正则-- 先上代码吧,今天先搞一小部分: import r ...

  6. python 逆向生成正则表达式_用Python中的正则表达式生成lis

    我有一个小脚本,用来产生一个预定义的字体和文本图像.我想将其更改为使用多种字体来呈现相同的文本,例如字母A以5种字体呈现.我将我的字体列表定义为: fonts = [ 'Georgia', 'Cons ...

  7. python正则替换查询_使用Python中的正则表达式进行搜索和替换

    我有一个充满推文的日志文件.每条推文都在自己的行上,这样我就可以轻松地遍历文件了. 一个示例推文就像这样: @ sample This is a sample string $1.00 # sampl ...

  8. python嵌套列表法实现树_在python中创建递归迭代嵌套列表的“数据树”路径

    我正在尝试创建一个"路径"列表,该列表中的每个项目都有.例如输入列表:_list = [[x,x,x], [[x,x,x],[x,x,x]], [x,x,x]] 期望输出: ^{p ...

  9. 在python中函数不可以嵌套调用_在Python中调用嵌套函数

    我有一个方法,我已经分解成更小的嵌套函数来分解代码基:def foo(x,y): def do_this(x,y): pass def do_that(x,y): pass do_this(x,y) ...

最新文章

  1. 下载安装 binary editor
  2. 【转载】老鸟程序员总结的这些小技巧
  3. while循环,递进,linux按行读入并按数组存储
  4. 修改文档框架:word-多级列表与标题样式相结合
  5. Linux根据端口号查进程
  6. 当新零售遇上 Serverless
  7. 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用...
  8. java类的加载机制
  9. 【牛客NOIP模拟】路径难题【建图】【最短路证明】
  10. 【数据结构与算法-java实现】三 Java数组类实现
  11. Hibernate一对一关联------主键关联(亲测成功)
  12. SQL 优化之该走索引却不走索引的分析
  13. 荣耀30S首销全平台夺冠 赵明:满足消费者对5G的所有需求和想象
  14. linux进程睡眠的介绍
  15. 视觉SLAM十四讲学习1 环境配置
  16. 度数秒分在线计算机,秒的换算(在线时间换算器)
  17. mac os X中关于dayone缓存的实际文件位置
  18. sketch插件开发
  19. 计算机毕业设计springcloud基于微服务的家居体验平台的设计与实现
  20. ISTQB认证考试通过秘籍 问题一、ISTQB是什么?有哪些分类? ISTQB(International Software Testing Qualification Board)是国际唯一权威的软

热门文章

  1. Python3 try-except、raise和assert解析
  2. LeetCode简单题之Fizz Buzz
  3. GPU上的图像和信号处理
  4. PyTorch全连接ReLU网络
  5. MindSpore应用目标
  6. CUDA 11功能展示
  7. 中原大学 php,台湾中原大学php教程孙仲岳主讲
  8. android 系统定位
  9. C中文件操作的文本模式和二进制模式,到底有啥区别?
  10. Eclipse里的文件搜索