python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构
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中使用正则表达式匹配嵌套结构相关推荐
- python中if嵌套语句_讲解Python中if语句的嵌套用法
可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...
- python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是
在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...
- python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配
喵喵时光机 falsetru的嵌套解析器(我稍作修改以接受任意正则表达式模式以指定分隔符和项目分隔符)比我的原始re.Scanner解决方案更快,更简单:import redef parse_nest ...
- python中if else语句用法_讲解Python中if语句的嵌套用法
可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...
- python中的正则表达式是干嘛的_操作python中的正则表达式(上)
上次的爬虫最终获取了马蜂窝旅行评论页面的全部内容,其实很多都是无用信息,我们要进行筛选清洗,这就用到了正则表达式,在写爬虫后续之前先大概搞一下正则-- 先上代码吧,今天先搞一小部分: import r ...
- python 逆向生成正则表达式_用Python中的正则表达式生成lis
我有一个小脚本,用来产生一个预定义的字体和文本图像.我想将其更改为使用多种字体来呈现相同的文本,例如字母A以5种字体呈现.我将我的字体列表定义为: fonts = [ 'Georgia', 'Cons ...
- python正则替换查询_使用Python中的正则表达式进行搜索和替换
我有一个充满推文的日志文件.每条推文都在自己的行上,这样我就可以轻松地遍历文件了. 一个示例推文就像这样: @ sample This is a sample string $1.00 # sampl ...
- python嵌套列表法实现树_在python中创建递归迭代嵌套列表的“数据树”路径
我正在尝试创建一个"路径"列表,该列表中的每个项目都有.例如输入列表:_list = [[x,x,x], [[x,x,x],[x,x,x]], [x,x,x]] 期望输出: ^{p ...
- 在python中函数不可以嵌套调用_在Python中调用嵌套函数
我有一个方法,我已经分解成更小的嵌套函数来分解代码基:def foo(x,y): def do_this(x,y): pass def do_that(x,y): pass do_this(x,y) ...
最新文章
- 下载安装 binary editor
- 【转载】老鸟程序员总结的这些小技巧
- while循环,递进,linux按行读入并按数组存储
- 修改文档框架:word-多级列表与标题样式相结合
- Linux根据端口号查进程
- 当新零售遇上 Serverless
- 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用...
- java类的加载机制
- 【牛客NOIP模拟】路径难题【建图】【最短路证明】
- 【数据结构与算法-java实现】三 Java数组类实现
- Hibernate一对一关联------主键关联(亲测成功)
- SQL 优化之该走索引却不走索引的分析
- 荣耀30S首销全平台夺冠 赵明:满足消费者对5G的所有需求和想象
- linux进程睡眠的介绍
- 视觉SLAM十四讲学习1 环境配置
- 度数秒分在线计算机,秒的换算(在线时间换算器)
- mac os X中关于dayone缓存的实际文件位置
- sketch插件开发
- 计算机毕业设计springcloud基于微服务的家居体验平台的设计与实现
- ISTQB认证考试通过秘籍 问题一、ISTQB是什么?有哪些分类? ISTQB(International Software Testing Qualification Board)是国际唯一权威的软