livelex lexer

livelex的Python项目详细描述


此模块将文本解析为标记,并且只能重新分析修改过的部分 使用先前生成的标记。标记化文本位于树中 结构,其中包含用于查找标记和上下文的强大查询方法。在

livelex模块的设计速度很快,可以在后台进行标记化 线程,这样即使在使用非常大的文档时,GUI应用程序 要有反应,不要停下来。在

主要用例:在文本编辑器中突出显示语法,还可以理解 文本的含义能够提供上下文相关的编辑功能。在

livelex模块由Wilbert Berendsen编写和维护。在

主页:https://github.com/wbsoft/livelex 下载:https://pypi.org/project/livelex/

该模块设计为使用规则(正则表达式)解析文本 基于。规则被分组到词典中,而词典被分组到 语言对象。每个词典都有一套描述文本的规则 在这种情况下,这是意料之中的。在

规则由三部分组成:模式、动作和目标。在

  • 模式可以是正则表达式字符串,也可以是 继承模式。在这种情况下,调用其build()方法来获取 图案。如果模式匹配,则创建匹配对象。如果没有, 下一个规则被尝试。在

  • 动作可以是任何对象,并与匹配的部分流在一起 文本的。这可以看作是一种象征。如果操作是 调用它的filter_actions()方法,它可以生成0或 更多代币。特殊的跳过操作将跳过匹配的文本。在

  • 目标是一个对象列表,可以是整数或引用 不同的词汇。一个正数将同一个词典推送到 堆栈,而负数将当前词典从堆栈中弹出,因此 对文本的词法分析继续使用以前的词典。这也是可能的 弹出一个词典,然后推出另一个。在

    也可以使用DynamicTarget对象而不是对象列表,它 可以根据匹配对象更改目标。在

使用特殊规则,词典可以指定一个默认操作,即 包含字典中任何其他规则都无法识别的文本流。 词典还可以指定一个默认目标,当没有规则时选择该目标 与当前文本匹配。在

解析

解析(更好:词法分析)文本总是从一个称为 根词典。那本词典里的规则是一个接一个地尝试的。一到那里 是一个匹配项,一个标记与匹配文本生成的位置 文本和规则中指定的操作。如果目标是 指定,解析将在另一个词典中继续。在

令牌放在树结构中。每一个活跃的词汇都创造了一个语境 包含标记和子上下文的列表。如果目标弹回到 上一个词典,上一个上下文又变成了当前的。在

所有的标记和上下文都指向它们的父对象,因此可以进行操纵 并以多种方式查询树结构。在

树的结构由TreeBuilder构建,请参见treebuilder模块。词根是承载词根词汇的上下文。 根上下文包含标记和/或其他上下文。在

TreeBuilder能够在后台线程中标记文本,并且 也可以重新生成文本的一部分,巧妙地重用前面的部分 生成令牌(如果可能)。在

迭代查询

Token和Context都有很多方法来遍历树,因为 获取父节点、子节点或同级节点。上下文有各种find() 方法快速查找文本中某个位置的标记或上下文。在

使用上下文.查询属性可以构建类似XPath的筛选链 奎因根据文本、动作或词典快速查找标记或上下文。 这在查询模块中进行了描述。在

示例

下面是一些如何创建语言类然后使用它的示例:

importlivelexfromliveleximport(Language,lexicon,words,bygroup,bymatch,bytext,default_action,default_target,skip,tomatch,)classMyLang(Language):"""A Language represents a set of Lexicons comprising a specific language.

    A Language is never instantiated. The class itself serves as a namespace
    and can be inherited from.



    """@lexicon(re_flags=0)defroot(cls):yieldr'"',"string",cls.stringyieldr'\(',"paren",cls.parenthesizedyieldr'\d+',"number"yieldr'%',"comment",cls.commentyieldr'[,.!?]',"punctuation"yieldr'\w+',"word"@lexicondefstring(cls):yieldr'\\[\\"]','string escape'yieldr'"',"string",-1yielddefault_action,"string"@lexicon(re_flags=re.MULTILINE)defcomment(cls):yieldr'$',"comment",-1yieldr'XXX|TODO',"todo"yielddefault_action,"comment"@lexicondefparenthesized(cls):yieldr'\)',"paren",-1yield fromcls.root()s=r"""
This is (an example) text with 12 numbers
and "a string with \" escaped characters",
and a % comment that TODO lasts until the end
of the line.
""">>>importlivelex>>>tree=livelex.root(MyLang.root,s)>>>tree.dump()<ContextMyLang.rootat1-144(20children)>├╴<Token'This'at1(word)>├╴<Token'is'at6(word)>├╴<Token'('at9(paren)>├╴<ContextMyLang.parenthesizedat10-21(3children)>├╴<Token'an'at10(word)>├╴<Token'example'at13(word)>╰╴<Token')'at20(paren)>├╴<Token'text'at22(word)>├╴<Token'with'at27(word)>├╴<Token'12'at32(number)>├╴<Token'numbers'at35(word)>├╴<Token'and'at43(word)>├╴<Token'"'at47(string)>├╴<ContextMyLang.stringat48-84(4children)>├╴<Token'a string with 'at48(string)>├╴<Token'\\"'at62(stringescape)>├╴<Token' escaped characters'at64(string)>╰╴<Token'"'at83(string)>├╴<Token','at84(punctuation)>├╴<Token'and'at86(word)>├╴<Token'a'at90(word)>├╴<Token'%'at92(comment)>├╴<ContextMyLang.commentat93-131(3children)>├╴<Token' comment that 'at93(comment)>├╴<Token'TODO'at107(todo)>╰╴<Token' lasts until the end'at111(comment)>├╴<Token'of'at132(word)>├╴<Token'the'at135(word)>├╴<Token'line'at139(word)>╰╴<Token'.'at143(punctuation)>>>>tree.find_token(50)<Token'a string with 'at48(string)>>>>tree.find_token(50).parent<ContextMyLang.stringat48-84(4children)>>>>d=livelex.Document(MyLang.root,s)>>>d<Document'\nThis is (an example) text w...'>>>>print(d.text())Thisis(anexample)textwith12numbersand"a string with \" escaped characters",anda%commentthatTODOlastsuntiltheendoftheline.>>>d[50:56]'string'>>>withd:...d[9:12]='(a "much longer'...d[20:20]='"'...>>>print(d.text())Thisis(a"much longer example")textwith12numbersand"a string with \" escaped characters",anda%commentthatTODOlastsuntiltheendoftheline.>>>d.get_root()[3].dump()<ContextMyLang.parenthesizedat10-34(4children)>├╴<Token'a'at10(word)>├╴<Token'"'at12(string)>├╴<ContextMyLang.stringat13-33(2children)>├╴<Token'much longer example'at13(string)>╰╴<Token'"'at32(string)>╰╴<Token')'at33(paren)>

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
mysql java语言非法参数异常?   java绘制控制流图   无法通过java eclipse中的ssh隧道远程连接到mysql数据库   直接在@SuppressWarnings之后出现java Eclipse错误(“未选中”)   java如何使用远程api google应用程序引擎api客户端?   工具栏中的java导航图标颜色未更改?   java返回带有映射子集的实体   java Spring重新加载属性Bean未更新   fileoutputstream正在获取java。木卫一。IOException:流关闭错误,但未显式关闭它   jsp标记显示java。时间使用jstl的LocalDateTime   java如何设置onFailure事件(Spring,Kafka)的超时?   将java元素添加到多个线程中的列表时,会跳过这些元素   JAVAutil。扫描程序Java读取空格后的整数值   java JMonkey过滤器着色器获取片段的世界位置   java从mongodb获取随机值   java如何使用Intent。标记\u活动\u清除\u顶部以清除活动堆栈?   多线程如何控制在多个端口上监听的java服务器应用程序   在具有复合键的相关实体之间插入数据时发生java Hibernate错误