Great Expectations的expect_values_to_match_regex规则在Snowflake上报错
问题分析与解决方案
Great Expectations(GE)在Snowflake环境下使用expect_column_values_to_match_regex规则时,会将正则表达式直接传递给Snowflake的REGEXP_LIKE函数执行,因此必须严格遵循Snowflake的正则语法规范,而非Python标准正则语法——这就是你之前可用的正则现在报错的核心原因。
1. SSN正则报错:重复运算符无参数
你使用的原正则:
^(?!666|000|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4}$
问题点:
- Snowflake的
REGEXP_LIKE不支持Python风格的负向预查(?!...),这直接触发了语法解析错误; - 虽然Snowflake兼容
\d表示数字,但使用POSIX字符类[0-9]或[:digit:]的兼容性更稳定。
修正后的Snowflake兼容SSN正则:
^([0-8]\d{2}|6[0-5]\d|66[0-5])-(?!00)\d{2}-(?!0000)\d{4}$
该写法通过正向匹配合法前缀,避开了666、000和9开头的三位数字段,同时保留了中间两位非00、末尾四位非0000的校验逻辑。
2. 基础正则报错:字符类范围无效
原正则[Aa-Zz]的问题很明确:正则字符类的范围必须遵循ASCII码升序规则,a的ASCII码(97)大于Z的ASCII码(90),因此a-Z这个范围是非法的,Snowflake会直接判定为无效范围。
修正后的两种写法:
- 标准大小写字母匹配:
[A-Za-z]
- Snowflake支持的POSIX字符类(更简洁):
[[:alpha:]]
验证建议
在GE中使用正则前,先在Snowflake控制台直接执行REGEXP_LIKE测试有效性,比如:
SELECT REGEXP_LIKE('123-45-6789', '^([0-8]\\d{2}|6[0-5]\\d|66[0-5])-(?!00)\\d{2}-(?!0000)\\d{4}$') AS valid_ssn;
确认返回TRUE后再代入GE规则,避免无效调试。
内容的提问来源于stack exchange,提问作者manas swami
相关产品推荐
相关产品推荐

