允许重叠的模式子串匹配:二进制串特定片段提取需求
解决二进制字符串中重叠片段的正则提取问题
嘿,我来帮你搞定这个正则匹配的问题!首先得明确你要的是以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
- 开头是
验证你的示例
我们用这个正则对三个示例字符串测试:
- 第一个字符串
100010011100:
匹配到的捕获组1内容是10001(从第1个1开始到第5个字符的1)、1001(从第5个字符的1开始到第8个字符的1),和你的预期完全一致。 - 第二个字符串
001111110000:
所有1都是连续的,不存在“1+至少一个0+1”的结构,所以无结果,符合预期。 - 第三个字符串
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
相关产品推荐
相关产品推荐

