没有项目描述
bourbaki.regex的Python项目详细描述
使正则表达式可读
简介
bourbaki.regex
为构造任意复杂的
使用标准python语法的正则表达式。
套餐的目标如下:
允许用户尽可能简洁,同时不牺牲可读性
支持标准库regex引擎(
re
module)中提供的所有结构。可扩展和模块化,以支持未来更先进的结构, 例如,由
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"
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"
。 匹配。