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

如何用Python/BigQuery正则表达式实现起始位置相同的重叠匹配?

提取字符串所有开头前缀序列的实现方案

Python 实现

方法1:分割拼接(简单直观)

无需正则,直接分割字符串后逐步拼接前缀,代码清晰易维护:

s = '1.2.5.6.8.10.12'
parts = s.split('.')
# 生成前n个部分拼接的前缀,最后一个前缀不加末尾的点
prefixes = ['.'.join(parts[:i+1]) + '.' for i in range(len(parts)-1)] + [s]
print(prefixes)
# 输出:['1.', '1.2.', '1.2.5.', '1.2.5.6.', '1.2.5.6.8.', '1.2.5.6.8.10.', '1.2.5.6.8.10.12']

方法2:正则正向预查(用正则实现重叠匹配)

利用正则的**正向预查(零宽度断言)**实现重叠匹配,正向预查不会消耗字符串字符,能反复匹配开头到不同位置的前缀:

import re
s = '1.2.5.6.8.10.12'
# 正向预查捕获所有开头到当前位置的合法前缀
pattern = r'(?=(^(\d+(?:\.\d+)*\.?)))'
matches = [m.group(1) for m in re.finditer(pattern, s)]
# 去重(最后一个字符位置会匹配两次,一次带点一次不带)
prefixes = list(dict.fromkeys(matches))
print(prefixes)
# 输出:['1.', '1.2.', '1.2.5.', '1.2.5.6.', '1.2.5.6.8.', '1.2.5.6.8.10.', '1.2.5.6.8.10.12']

解释:你原正则^(\d+(?:\.|$))+的问题在于,贪婪匹配会一次性匹配整个字符串,且捕获组只保留最后一次匹配的12;而正向预查能让正则每次检查从开头到当前位置的子串,从而捕获所有前缀。

BigQuery 实现

通过分割字符串+数组函数生成所有前缀:

WITH input_data AS (
  SELECT '1.2.5.6.8.10.12' AS target_str
),
split_result AS (
  SELECT 
    target_str,
    SPLIT(target_str, '.') AS parts_array
  FROM input_data
)
SELECT
  target_str,
  ARRAY(
    SELECT 
      ARRAY_TO_STRING(ARRAY(SELECT parts_array[OFFSET(idx)] FOR idx IN GENERATE_ARRAY(0, n)), '.') 
      || IF(n < ARRAY_LENGTH(parts_array)-1, '.', '')
    FROM UNNEST(GENERATE_ARRAY(0, ARRAY_LENGTH(parts_array)-1)) AS n
  ) AS all_prefixes
FROM split_result;

执行后all_prefixes字段会返回所需的前缀数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:46:06