python - 正则表达式在 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 是我制作的光标的名称。
这里有什么问题。
解决方案
这里的问题是,在将字符串呈现给 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}$');
推荐阅读
- postgresql - 使用表中行的名称创建表
- azure - 是什么导致 Azure 中的 VM 突然跳转和关闭
- c# - 使用 EWS C# 发送视频附件
- javascript - “EventTarget”类型缺少以下属性
- php - 如果其他结构不适用于某些文本,我正在使用 Google 重新捕获可能是什么?
- google-analytics - 如何跟踪 Google Analytics 中的所有事件?
- html - 为什么“高度”中的百分比单位没有动画/过渡(css)
- typescript - Bull :作业缺少进程处理程序
- python - Python:X 标记了踪迹
- mysql - (1093, u"You can't specify target table 'wallet_consume_record' for update in FROM clause") 在mysql中使用delete时