首页 > 解决方案 > 正则表达式在 Snoflake python 连接器中没有按预期工作

问题描述

我写了一个查询,它将过滤掉所有不属于模式(nnn)-nnn-nnnnn的 phone_no 。

select * 
from employee
where  not RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');

当我直接在Snowflake Console中查询时,它给出了预期的结果。但是,当我使用它snowflake-connector-python来运行相同的查询时,python它并没有按预期工作。

        query="""
                INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
                select * , 'Phone_No::Invalid Number'
                from DEMO_DB.PUBLIC.employee
                where  NOT  RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');
        """
        cs.execute(query).

CS 是我制作的光标的名称。

这里有什么问题。

标签: pythonsnowflake-cloud-data-platformsnowflake-tasksnowsql

解决方案


这里的问题是,在将字符串呈现给 Snowflake之前,Python 正在解释字符串文字(三引号内的文本)中的特殊字符(如反斜杠) 。要指示 Python 不要这样做,请在开头的三引号前加上r,如下所示:

query=r"""
INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
select * , 'Phone_No::Invalid Number'
from DEMO_DB.PUBLIC.employee
where  NOT  RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');
"""

如果你像这样编写一个简单的 Python 脚本并执行它,你可以很容易地看到区别:

query="""
INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
select * , 'Phone_No::Invalid Number'
from DEMO_DB.PUBLIC.employee
where  NOT  RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');
"""
print(query)
query=r"""
INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
select * , 'Phone_No::Invalid Number'
from DEMO_DB.PUBLIC.employee
where  NOT  RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');
"""
print(query)

输出是:

INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
select * , 'Phone_No::Invalid Number'
from DEMO_DB.PUBLIC.employee
where  NOT  RLIKE(phone_no,'^\(\d{3}\)-\d{3}-\d{4}$');


INSERT  into   DEMO_DB.PUBLIC.EMPLOYEE_INTER_ATIF
select * , 'Phone_No::Invalid Number'
from DEMO_DB.PUBLIC.employee
where  NOT  RLIKE(phone_no,'^\\(\\d{3}\\)-\\d{3}-\\d{4}$');

推荐阅读