正则表达式在 Snoflake python 连接器中无法正常工作
Regular Expression not working as expected in Snoflake python connector
我写了一个查询,它将过滤掉所有不属于 (nnn)-nnn-nnnnn.
模式的 phone_no
select *
from employee
where not RLIKE(phone_no,'^\(\d{3}\)-\d{3}-\d{4}$');
当我直接在 Snowflake 控制台 中查询时,它给出了预期的结果。
但是当我使用 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是我做的光标的名字。
这里有什么问题。
这里的问题是 Python 正在解释字符串文字(triple-quotes 中的文本)中的特殊字符(如反斜杠)在字符串被呈现给 Snowflake。要指示 Python 不要这样做,请在开头 triple-quote 前加上 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}$');
我写了一个查询,它将过滤掉所有不属于 (nnn)-nnn-nnnnn.
模式的 phone_noselect *
from employee
where not RLIKE(phone_no,'^\(\d{3}\)-\d{3}-\d{4}$');
当我直接在 Snowflake 控制台 中查询时,它给出了预期的结果。
但是当我使用 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是我做的光标的名字。
这里有什么问题。
这里的问题是 Python 正在解释字符串文字(triple-quotes 中的文本)中的特殊字符(如反斜杠)在字符串被呈现给 Snowflake。要指示 Python 不要这样做,请在开头 triple-quote 前加上 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}$');