没有项目描述

bourbaki.regex的Python项目详细描述


使正则表达式可读

简介

bourbaki.regex为构造任意复杂的 使用标准python语法的正则表达式。

套餐的目标如下:

  • 允许用户尽可能简洁,同时不牺牲可读性

  • 支持标准库regex引擎(remodule)中提供的所有结构。

  • 可扩展和模块化,以支持未来更先进的结构, 例如,由regex模块提供

  • 将python字符串文本视为尽可能匹配的文本字符串,从而避免了对特殊字符串的需要 构造器

  • 处理冗长的细节,例如文字中的转义特殊字符,并为
    推断正确的组索引 反向引用,允许用户将它们指定为对以前构造的 bourbaki.regex.regex对象

  • 在编译时引发有意义的错误,例如命名组冲突,不存在 非固定长度的回溯引用和回溯断言

基本正则表达式构造函数

有几个基本构造函数可以用来构建所有的表达式模式。 它们中的每一个,以及下面各节中涉及它们的所有表达式,都会产生bourbaki.regex.regex的实例, 它有编译的python regex的常用方法-.match.search.fullmatch.findall.finditer.sub.subn.split-以及属性.pattern

要编译带有regex标志的模式(即re.ignorecase),请将它们传递给.compile方法。 结果将是一个常见的python正则表达式。

  • bourbaki.regex.c:字符类构造函数。 例如,c['a':'z','a-z','0':'9']相当于原始正则表达式r'[a-za-z0-9]

  • bourbaki.regex.l/literal:文本字符串匹配。此函数处理转义保留给的特殊字符 正则表达式语法。 例如,l('*foo[bar]*')相当于原始正则表达式r'\*foo\[bar]\*' (请注意""转义)

  • bourbaki.regex.if:用于构造条件模式。 例如,

    foo=L("foo")bar=L("bar")foobar=foo.optional+If(foo).then_(bar).else_("baz")

    foo bar现在将匹配"foobar""baz",但不匹配"foo",因为模式需要遵循"bar"。 当"foo"匹配时。

  • 特殊符号,包括: 开始、结束、anychar、startstring、endstring、tab、endline、backspace、carrienreturn wordboundary、wordinternal、wordchar、nonwordchar、digit、nondigit、whitespace、nonwhitespace, 它们是自我描述的。

所有其他类型的模式都可以通过使用前面的运算符、方法调用或属性访问来构造 构造的图案,如下所述。

重复

*(乘法)运算符表示模式的固定重复次数。 这与原始regex语法不同,但乘法运算符与python字符串语义匹配。

[]\u getitem\uuu)构造还用于表示一系列副本上的重复。 这个构造与它的原始regex花括号非常相似,同时添加了一些功能 在表示数值范围时匹配python切片语义(尽管始终包含上限,如 原始正则表达式)。

常见的重复要求可以通过.one_or_more.zero_or_more,和。可选的属性。

  • l("foo")*3将匹配"foofoo"

  • l("foo")[1:2]将匹配"foo""foofoo"

  • l("foo")[:]相当于l("foo")。零个或更多个并匹配任意数量的"foo"副本,包括 空字符串。

  • l("foo")[1:相当于l("foo")。一个或多个并匹配任意数量的"foo"副本,要求 至少一个。

  • l("foo")[:1]相当于l("foo")。可选的并匹配"foo"或空字符串。

  • l("foo")[1:5:2]将匹配1、3或5个副本 复杂的正则表达式非常简单。

交替

(pipe/bitwise or)运算符用于表示交替,因为它在原始regex中。

  • l("foo")"bar"将匹配"foo""bar"

  • 当运算符的两边都是字符类时,管道运算符将导致另一个字符类匹配 内容的结合。这在语义上与regex中的alternation相同,但会导致更简洁的 编译模式。例如,c['a-z']c['0':'9']编译为模式'[a-z0-9]',而不是'[a-z][0-9]'

连接

二进制+(加法)运算符用于表示模式的串联。 这与原始正则表达式语法(在相邻模式中隐式连接)不同,但捕获了通常的python 字符串语义。

  • l("foo")+"bar"将匹配"foobar"(请注意,原始字符串"bar"被隐式视为文本)。

捕获组

bourbaki.regex只在明确要求时构造捕获组。 函数调用语法可用于创建捕获组,以单个字符串参数作为名称 (受记忆的驱使,一个组被一个名字叫做)。 或者,省略名称会导致未命名的捕获组,即在原始regex中,我们在两边加上括号 表示捕获的模式,在bourbaki.regex中,我们在模式的末尾放置一个空对。 .as方法和.captured属性也可用于此目的。

  • c['0':'9'].as_u("a_numeral")将导致正则表达式匹配其匹配项的单个数字,并调用 .group dict()方法将生成一个带有"a_number"键的dict,即这是一个命名组。 这相当于使用函数调用语法的c['0':'9']("a_number")

  • c['0':'9'].captured与上面一样,但组未命名。它将在编译的结果中得到一个数字 模式,可通过对任何匹配对象调用.groups()来访问。 这相当于使用函数调用语法的c['0':'9'](

前视和后视断言

lookahead和lookbehind断言可以分别用>;<;运算符构造。 匹配的模式"指向"前向或后向断言。

-一元运算符(否定)用于表示a否定断言

  • 例如,l("foo")>;gt;"bar"将匹配"foo",但只在后面跟"bar"

    的字符串中匹配。
  • 类似地,l("foo")<;<;"bar"将与"bar"匹配,但仅在前面有"foo"的字符串中匹配。

  • "foo">;>;-l("bar")将与"foo"匹配,但前提是不是后跟"bar"

  • -l("foo")<;<;"bar"将匹配"bar",但前提是不在"foo"之前

编译模式中的注释

//运算符可以在右侧获取用作注释的原始字符串。 它对结果模式的匹配行为没有影响,但将作为注释出现在 编译模式。

  • l("foo")/"foo,通常的占位符名称"编译为模式 <代码>(?#foo,通常的占位符名称)foo"
注: python的标准库regex引擎不支持可变长度的lookbehind断言。 如果尝试使用与可变长度字符串匹配的模式作为lookbehind断言,将得到一个有用的错误。 使用regex或其他符合python的re模块api,但支持可变长度查找 断言,只需将bourbaki.regex.base导入为bre,然后设置 bre.require_fix_len_lookbehind=false;bre.re=<;首选正则表达式模块>;

原子群

一元运算符用于构造原子组。 这意味着,一旦regex引擎与原子模式匹配,它将永远不会返回到匹配之前。 也可以使用.atomic属性。

python的标准库regex引擎本机不支持此功能,但其他模块如 regex做。 因此,在默认情况下,bourbaki.regex构造一个标准的python regex,它的行为就好像它是原子的,通过使用 回溯完成相同的目标。 使用regex或其他符合python的re模块api,但支持 原子组本机地,只需将bourbaki.regex.base导入为bre,然后设置 bre.atomic_group_support=true;bre.re=<;您首选的regex模块>;

  • 例如,"a"+(l("b c")"b").atomic+"c"将匹配"abcc",但不匹配"abc",因为这两个字符串都会导致 模式中间的原子组,只要匹配了"bc",就将被消耗,剩下一个"c"。 匹配。

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

推荐PyPI第三方库


热门话题
java如何提高我的软件项目的速度?   java将Jetty嵌入JavaSE项目   数组中的java重复字符   java我的Shell排序没有按预期工作,我需要一些帮助来找出我做错了什么   java如何在JBoss EAP6/AS7中应用先过滤后安全约束   java使用一个随机运算符来处理多个变量   java为什么我不能在文件中写我的二叉树?   java应用程序不会在Eclipse emulator上运行   我第一次尝试制作一个简单的基于瓷砖的java游戏   java为TermVectors安装Solr修补程序   java无法将更新的对象值从客户端发送到服务器,服务器读取不存在的值   Azure,java sdk,使用ARM模板部署无法转换参数文件   是否有一个Java等价于空合并运算符(?)在C#?   java如果只初始化了超类对象,是否可以调用特定于子类的方法?   向类文件传递值时出现java NullPointerException   java模不起作用   java Android TranslateAnimation动态更新布局的大小   数据结构如何在java中实例化队列对象?   java如果用户选择一些随机的相机应用程序,如何在安卓中正确处理相机意图?