创建正则表达式引擎的自定义扩展

时间:2012-10-01 18:57:23

标签: python regex dsl

有没有简单的方法可以添加自定义扩展程序 正则表达引擎? (特别是对于Python,但我会采取 一般的解决方案)。

可能更容易解释我正在尝试使用的构建 例。以下是我的用例:

我希望用户能够匹配可能包含任意内容的字符串 ASCII字符。正则表达式是一个良好的开端,但事实并非如此 对于我想到的数据类型来说已经足够了。例如,说我 拥有包含如下字符串的数据:

<STX>12.3,45.6<ETX>

其中<STX><ETX>是文本开头/文字结尾字符 0x02和0x03。为了捕获这两个数字,它会非常 方便用户能够指定任何ASCII 表达中的人物。像这样:

\x02(\d\d\.\d),(\d\d\.\d)\x03

“\ x02”和“\ x03”匹配控制字符和 第一个和第二个匹配组是数字。所以,像 正则表达式只有几个特定于域的附加组件。

我应该怎么做呢?这是否是正确的方法? 我不得不相信这种问题已经解决了,但我最初的问题 搜索没有发现任何有希望的东西。正则表达式 众所周知的优势,保持学习曲线。

一些注意事项:

  • 我不是在寻找特定协议的固定解析器 - 它需要通用且用户可配置
  • 我真的不想写自己的正则表达式引擎
  • 虽然它会很好,但我并不是在寻找“正则表达式宏”,我在其中创建了一些常用表达式的快捷方式。 (也许是一个后续问题......)
  • 奖励:您是否听说过任何学术工作,即“创建特定领域的搜索语言”

编辑:感谢您的答复到目前为止,我还没有意识到Python re支持任意ascii字符。但是,这仍然不是我想要的。这是另一个希望最终给出我想要的广度的例子:

假设我的数据包含这样的字符串:

$\x01\x02\x03\r\n

123形成两个12位整数(0x010和0x023)。那么我怎样才能添加语法,以便用户可以将其与正则表达式匹配:

\$(\int12)(\int12)\x0d\x0a

\int12每个都提取12位。如果尝试搜索打包数据,这将非常方便。

1 个答案:

答案 0 :(得分:2)

Python正则表达式解析器已经支持

\x转义符:

>>> import re
>>> regex = re.compile(r'\x02(\d\d\.\d),(\d\d\.\d)\x03')
>>> regex.match('\x0212.3,45.6\x03')
<_sre.SRE_Match object at 0x7f551b0c9a48>