Регулярное выражение не работает должным образом в соединителе Snoflake python

Я написал запрос, который отфильтрует все phone_no, не входящие в шаблон (nnn) -nnn-nnnnn.

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 - это имя курсора, который я сделал.

В чем проблема.


person Atif    schedule 26.08.2020    source источник
comment
Попробуйте превратить двойные косые черты в одинарные, я не уверен, что вам нужно избегать косых черт в этом контексте?   -  person Lorna Mitchell    schedule 26.08.2020
comment
@LornaMitchell, я тоже это сделала, но не сработало.   -  person Atif    schedule 26.08.2020


Ответы (1)


Проблема здесь в том, что Python интерпретирует специальные символы (например, обратную косую черту) в строковом литерале (тексте в тройных кавычках) до того, как строка будет представлена ​​Snowflake. Чтобы указать 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}$');
person Darren Gardner    schedule 26.08.2020
comment
Да, мне удалось исправить проблему, распечатав, я смог увидеть, что он съедает косую черту, поэтому я добавил еще одну косую черту, и она начала работать - person Atif; 27.08.2020