如何用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
相关产品推荐
相关产品推荐

