为人们设计的简单正则表达式构建器。
项目描述
XR:面向人们的正则表达式,不仅仅是面向机器
xr:面向人们的正则表达式。 网站上的完整参考手册。
版本 v1.0
Xr是一个优雅、简单、周到、可扩展且可测试的Python正则表达式库,旨在由实际人们阅读和编写。
Xr使构建和重用经过良好测试的正则表达式子组件库变得容易。只需尝试一次xr,你就不会再复制粘贴正则表达式了。
优秀功能
Xr支持现代编程实践
- 优化
- 可组合性
- 单元测试支持
Xr已针对Python 2.7和3.4-3.8以及PyPy进行测试
入门
Xr在PyPI上分发,因此安装与运行pip一样简单
pip install xr
Hello World
所有编程语言的优秀介绍都始于“Hello World”。Xr也不例外。在本教程中,您将学习如何使用xr库构建的正则表达式识别字符串“Hello World”。
>>> from xr import Text
>>> hello_world = Text('Hello World')
>>> hello_world.match_exact('Hello World')
<re.Match object; span=(0, 11), match='Hello World'>
>>> hello_world.match_exact('Goodbye World')
(None)
注意,当我们匹配时,我们返回re.Pattern对象,如果没有匹配,则返回None。这符合Python内置re库的行为。Xr为您组合正则表达式源字符串,并将这些字符串传给re库,在那里实际的正则表达式匹配操作才发生。
我们的好玩程序相当不错,但它并不涵盖所有重要的Hello World用例:一些程序员对学习如何使用新库变得非常热情,并以感叹号来表现这种热情。我们当然希望容纳这种热情,因此我们应该允许正则表达式末尾有一个可选的感叹号。
>>> hello.world.match_exact('Hello World!')
(None)
>>> hello_world = Text('Hello World') + Text('!').optional()
>>> hello_world.match_exact('Hello World!')
<re.Match object; span=(0, 12), match='Hello World!'>
到目前为止一切顺利,但如果我们程序员真的非常热情怎么办?如果我们遇到两个、三个或更多的感叹号怎么办?热情是好的,我们想欢迎所有的一切!!!
>>> hello.world.match_exact('Hello World!!!!!!!!!!')
(None)
>>> hello_world = Text('Hello World') + Text('!').many()
>>> hello_world.match_exact('Hello World!!!!!!!!!!')
<re.Match object; span=(0, 21), match='Hello World!!!!!!!!!!'>
Xr支持运算符重载,让我们使我们的示例变得更简单。因为底层正则表达式对象实现了__add__
和__radd__
,所以我们可以简化像Text('a') + Text('b')
这样的表达式。如果a +表达式的某一边是xr.R
E对象,我们的库足够聪明,可以处理另一边是字符串的情况。在这种情况下,我们可以通过编写来减少一些代码量
>>> hello_world = "Hello World" + Text('!').many()
到目前为止,我们已经容纳了热情的程序员,但只是说英语的热情程序员。世界上大多数人口并不说英语是母语。当人们对如何使用新的库感到兴奋时,认为“你好世界”的人比认为“Hello World”的人要多得多。
在我们能够容纳一种新语言之前,我们应该稍微重构我们的代码。xr库的一个强大功能是,你可以在纯Python中构建你的正则表达式。这使得可以访问编写编程语言的所有特性和便利性,如子组件的变量名。
>>> verbiage = "Hello World"
>>> punctuation = "!".many()
>>> hello_world = verbiage + punctuation
现在代码重构后,我们可以修改我们的程序以识别中文。阅读此代码时,请记住,要使xr表达式之间的运算符工作,至少运算符的一边必须是xr.RE子类。我们必须编写类似Text('a') | 'b' | 'c' | 'd'
或'a' | 'b' | Text('c') | 'd'
的东西。我们不能写这个:'a' | 'b' | 'c' | 'd'
。
>>> verbiage = Text("Hello World") | "你好世界"
当我们在做这件事的时候,让我们添加更多语言。世界上大多数潜在的热情程序员在他们非常非常热情的时候不说英语或普通话。
>>> verbiage = Text("Hello World") | "你好世界" | "Hola Mundo" | "Привет мир";
在创建正则表达式时,很容易忘记你实际上是在Python语言中的抽象语法树中描述你的正则表达式。记住,xr表达式是可组合的——你可以程序性地构建你的树。
>>> from functools import reduce # For python 3 users
>>> verbiage = ["Hello World",
... "你好世界",
... "Hola Mundo",
... "Привет мир",
... "مرحبا بالعالم"]
>>> verbiage = reduce(lambda x,y: x|y, map(Text, verbiage))
>>> punctuation = "!".many()
>>> hello_world = verbiage + punctuation
>>> hello_world.match('你好世界!!!')
<re.Match object;span=(0, 7), match='你好世界!!!'>
>>> hello_world.match('Hola Mundo')
< re.Match object;span=(0, 10), match='Hola Mundo'>
>>> hello_world.match('Hello World')
<re.Match object; span=(0, 11), match='Hello World'>
我们的Hello World现在更具包容性,但关于多语言程序员怎么办?让我们修改我们的Hello World程序以接受任何语言中任何语言的多个“你好世界”说法。
除了连接,正则表达式还支持或运算符——Text("a") | Text("b")匹配字符串“a”和“b”。
>>> hello_worlds = hello_world + (Text(" ").many(1) + hello_world).many()
项目详情
xr-1.0.5.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c1b6f638fc3dc9901c185c844f1509f67f0a134f1d66b1056a792e782e2be139 |
|
MD5 | 3cc2f066ce12aaf46f0cb1483d0a8cd0 |
|
BLAKE2b-256 | 46cfd82dd88af4774ddf6a74e8e4bc375cff59d27828b4f3b63eaf44cf4788dd |