python - 正则表达式根据子字符串的长度获取字符串
问题描述
您能否建议是否可能以及如何为下一个问题定义正则表达式:
我有 2 个由分隔符连接的“二进制”字符串。假设分隔符始终为 3。
输入数据示例:
11000031000111011001101111
0111000301000111011001101111
001310001110110011011110
在分隔符的右侧,我需要选择所有 '1+' blob,但我不想在分隔符的左侧选择长度等于 1+ blob 的 1+ blob。
例如,在这个输入上:
11000031000111011001101111
有这些 1+ blob:
left: 11
right: 1, 111, 11, 11, 1111
我需要选择所有正确的 1+ blob,但 '11',因为它们也存在于左侧。
所以在那个例子中我需要匹配:1,111,1111
其他示例:
0111000301000111011001101111 ==> 1,11,11,1111
001310001110110011011110 ==> 111,11,11,1111
我还需要知道每个字符串的位置(匹配对象)。了解此任务的复杂性以及是否可以构建 FSM 非常重要。如果限制左侧部分的大小(例如 < 8)怎么办
解决方案
由于您不仅特别要求正则表达式,而且要求有限状态机,因此我可以特别证明这是不可能的。在有限状态机中,您必须有一些有限数量的n
状态。1
对于在 3 的左侧找到的每个长度的 s 序列,我们需要一个状态。由于我们可以有无限多个可能长度的1
s 序列,因此不可能在有限多个状态中编码此信息。
如果你特别限制了左边部分的大小,你就有效地限制了一个1
s 序列的最大大小。这使它成为可能,尽管仍然不实用。
假设左边的尺寸是n
。对于出现的长度为 1 的每个可能组合,您都需要一个状态,即O(2^n)
. 祝你好运为此写一个正则表达式。您可能最终会有效地枚举大多数可能的组合,并且很少使用实际的状态机逻辑。
状态机示例n=4
:注意超过 16 个状态,这只是左侧。这里的每个“接受”状态都需要更复杂的逻辑来匹配右侧。
推荐阅读
- python - 获取json文件相同子键的值
- ios - 可选类型“URL?”的默认值
- c++ - 如何更改使用 CPack 安装的可执行文件的名称?
- monodevelop - 单一问题始终如一
- autodesk-forge - Forge Viewer - 标记 - 我们可以获取当前选择的 xy 坐标吗?
- php - 在 php 中制作一个平面表
- python - 残差图检查线性模型是否适用于多元线性回归的方法
- filter - 如何使用过滤器运算符返回 Observable?
- asp.net-core - app.UseStatusCodePagesWithReExecute("/Error/{0}"); 在 ASP.NET Core 2.2 中不工作
- reactjs - 盖茨比不使用反应钩子改变状态