Simple Regex Language

简介

SRL 是一个正则表达式的 DSL,其文档见 Simple RegexSimple Regex 通过将正则表达式转化为自然语言来增加可读性。 正则表达式很强大,但新手入门门槛高。这个库加快了理解正则表达式的时间,非常适合新手学习。 其原始实现是 PHP, 这两天为语言编写了 Python 实现。仓库是 SimpleRegex/SRL-Python

快速起步

  • 大小写不敏感
  • 逗号是可选的
  • 子查询需要使用括号
  • Characters 指的是可以匹配文字的部分:例如 letter, digit, literally
  • Quantifiers 用于指定出现次数
  • Groups 用于分组 Characters 和 Quantifiers,可用于做子查询
  • Lookarounds 用于做向前向后标记
  • Flags 是正则的标记,比如贪心,大小写敏感等
  • Anchors 用于指定起止

基本使用

>>> from srl import SRL
>>> srl = SRL('digit exactly 3 times')
>>> bool(srl.match('123'))
True
>>> bool(srl.match('12'))
False

进度

基本流程:

  • 使用 TDD 的方式,根据 PHP 项目的测试用例,快速构建起可用的 Builder
  • 补齐 simple regex 文档页提供的测试用例
  • 根据 Builder 写 Parser。
  • 完成开源项目的标准配置:文档,证书,发版,注释等。

时间表:

  • 1 Sep, 2016 编写了所有文档页提及的构建器方法,并通过了 srl 库对 builder 的所有单元测试用例
  • 2 Sep, 2016 继续完善 builder,使其通过了 Simple Regex Documentation 描述的所有特性,使用与 beanstalkc 测试类似的技术结合了文档和测试
  • 6 Sep, 2016 注意到上游原始PHP实现分化出了规范和各种语言的实现,均为占坑无实现状态。加入开发讨论组 simpleregex.slack.com。加入 SimpleRegex Github Developer Team。soasme/SRL.py 与作者讨论后做为 SRL-Python 的官方实现。注册了 Pypi SRL 包名。
  • 7 Sep, 2016 使用 lex yacc 实现了一个 parser,并将 parser 应用于文档测试。
  • 8 Sep, 2016 通过了所有的测试,针对命名,Builder的行为与开发组讨论,发出了第一个实现PR。编写了2/3兼容。重写了Documentation的文档测试。增加了新特性:打印SRL对象时显示正则表达式。实现合入主仓库。配置 Travis。发版 0.1.0。

学习

SRL-Python 的 Builder 实现与 SRL-PHP 是不谋而合的。 在单独实现的情况下,最后发现他们的实现几乎一样。

SRL-Python 的 Language Interpreter 实现与 SRL-PHP 完全不同。 作者对于 SRL-PHP 的 DSL 解析看起来还有缺陷。 这次在实现 SRL-Python 的过程中,第一次尝试使用了 lex + yacc 这套技术。 在已经有成文的规则后,使用 lex + yacc 实现一门 DSL 是相对简单的, 感觉上编码过程可以将注意力集中在规则的制定,而非解析组装这种细节。

SRL-Python 的单元测试在常规的测试用例之外还是用了文档测试。 第一次见到这种用法是在 beanstalkc,在提供库的使用方法的同时,测试也同时写好了。 SRL-Python 的说明书 本身也是很健全的测试。 Markdown 文档测试可以在 .nose.cfg 中指定。

EOF