0

是否有任何简单的方法可以将自定义扩展添加到正则表达式引擎?(特别是对于 Python,但我也会采用通用解决方案)。

用一个例子来解释我正在尝试构建的内容可能会更容易。这是我想到的用例:

我希望用户能够匹配可能包含任意 ASCII 字符的字符串。正则表达式是一个好的开始,但对于我心目中的数据类型来说还不够。例如,假设我有包含如下字符串的数据:

<STX>12.3,45.6<ETX>

其中<STX><ETX>是文本开始/文本结束字符 0x02 和 0x03。要捕获这两个数字,用户能够在其表达式中指定任何 ASCII 字符将非常方便。像这样:

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

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

我该怎么做呢?这甚至是正确的方法吗?我必须相信这类问题已经解决了,但我最初的搜索并没有发现任何有希望的东西。正则表达式具有众所周知的优势,可以降低学习曲线。

几点注意事项:

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

编辑:感谢到目前为止的回复,我还没有意识到 Pythonre支持任意 ascii 字符。但是,这仍然不是我想要的。这是另一个示例,希望最终能提供我想要的广度:

假设我有包含如下字符串的数据:

$\x01\x02\x03\r\n

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

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

其中\int12's 每个拉出 12 位。如果尝试搜索打包数据,这将很方便。

4

1 回答 1

2

\x escapes are already supported by the Python regular expression parser:

>>> 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>
于 2012-10-01T19:01:04.463 回答