You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

允许重叠的模式子串匹配:二进制串特定片段提取需求

解决二进制字符串中重叠片段的正则提取问题

嘿,我来帮你搞定这个正则匹配的问题!首先得明确你要的是以1开头、中间至少一个0、以1结尾的重叠片段(从你的预期结果来看,中间是至少有一个0的),你之前写的正则没抓住核心逻辑,所以没生效。下面给你一步步拆解解决方案:

为什么你的正则没生效

你写的[(?<=1)0][0(?=1)]其实是在匹配两个连续的0:第一个0前面得有1,第二个0后面得有1。这完全不是你要的“1开头+中间0+1结尾”的完整片段,自然得不到正确结果。

正确的正则方案

要捕获所有重叠的符合条件的片段,关键是用正向预查((?=...))——它不会消耗字符串里的字符,能让我们找到所有可能的起始位置,进而提取每个符合要求的片段。

针对你的需求,正则应该写成:

(?=(10+1))

正则解释

  • (?=...):正向预查,用来“预览”当前位置后面是否存在符合括号内模式的内容,匹配后不会移动匹配指针,这样就能支持重叠片段的提取。
  • 10+1:这是核心匹配规则:
    • 开头是1
    • 中间是+表示至少一个0(如果允许中间没有0,比如11这种情况,就把+换成*,变成10*1)
    • 结尾是1

验证你的示例

我们用这个正则对三个示例字符串测试:

  1. 第一个字符串 100010011100:
    匹配到的捕获组1内容是 10001(从第1个1开始到第5个字符的1)、1001(从第5个字符的1开始到第8个字符的1),和你的预期完全一致。
  2. 第二个字符串 001111110000:
    所有1都是连续的,不存在“1+至少一个0+1”的结构,所以无结果,符合预期。
  3. 第三个字符串 001010100011:
    匹配到的捕获组1内容是 101(位置2到4)、101(位置4到6)、10001(位置6到10),和你的预期完全匹配。

代码实现示例(以Python为例)

如果你需要用代码提取这些片段,可以参考下面的实现:

import re

def get_target_fragments(bin_str):
    # 这里用10+1匹配中间至少一个0的情况,若允许中间0个0则换成10*1
    regex_pattern = re.compile(r'(?=(10+1))')
    # 遍历所有匹配,提取捕获组1的内容
    return [match.group(1) for match in regex_pattern.finditer(bin_str)]

# 测试你的三个示例
print(get_target_fragments('100010011100'))  # 输出: ['10001', '1001']
print(get_target_fragments('001111110000'))  # 输出: []
print(get_target_fragments('001010100011'))  # 输出: ['101', '101', '10001']

内容的提问来源于stack exchange,提问作者crayfishcray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:37:00