Как удалить шаблонную строку .ds из строки, используя python - PullRequest
0 голосов
/ 01 мая 2020

У меня есть эта строка

a="""SELECT
    transform_abc.ds AS "ds",
    SUM(transform_abc.dollars) AS "dollars",
    transform_abc.unit AS "unit"
FROM fct_table_abc transform_abc
WHERE
    (
        transform_abc.is_charged > 0
        OR transform_abc.account_status = 0
    )
    AND transform_abc.ds = '2020-02-20'
GROUP BY
    transform_abc.ds,
    transform_abc.unit"""

Мне нужно удалить столбец с ds из этой строки после SELECT и GROUP BY, но не после WHERE.

Требуется вывод:

a="""SELECT
    SUM(transform_abc.dollars) AS "dollars",
    transform_abc.unit AS "unit"
FROM fct_table_abc transform_abc
WHERE
    (
        transform_abc.is_charged > 0
        OR transform_abc.account_status = 0
    )
    AND transform_abc.ds = '2020-02-20'
GROUP BY
    transform_abc.unit"""

Tranform_ab c - это просто имя таблицы, оно может быть любым именем таблицы. Так что мы не можем использовать это в регулярных выражениях. Не уверен, как решить эту проблему

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Вот способ go:

import re

a="""SELECT
    transform_abc.ds AS "ds",
    SUM(transform_abc.dollars) AS "dollars",
    transform_abc.unit AS "unit"
FROM fct_table_abc transform_abc
WHERE
    (
        transform_abc.is_charged > 0
        OR transform_abc.account_status = 0
    )
    AND transform_abc.ds = '2020-02-20'
GROUP BY
    transform_abc.ds,
    transform_abc.unit"""

res = re.sub(r'((?:SELECT|GROUP BY)\s+(?:(?!WHERE)[\s\S])*?)\s+[\w.]+\.ds.+', r'\1', a)
print res

Вывод:

SELECT

    SUM(transform_abc.dollars) AS "dollars",
    transform_abc.unit AS "unit"
FROM fct_table_abc transform_abc
WHERE
    (
        transform_abc.is_charged > 0
        OR transform_abc.account_status = 0
    )
    AND transform_abc.ds = '2020-02-20'
GROUP BY

    transform_abc.unit

Демонстрация и объяснение


Если SQL в одной строке, используйте:

((?:SELECT|GROUP BY)\s+(?:(?!WHERE)[\s\S])*?)\s*[\w.]+\.ds[^,]*,

Демонстрация и объяснение

0 голосов
/ 01 мая 2020

Пожалуйста, найдите ниже решение. Это может быть синтаксически некорректно, не скомпилировать его, но должно работать логически.

#!/usr/bin/python
import re

a="""SELECT 
transform_abc.ds AS "ds",
    SUM(transform_abc.dollars) AS "dollars",
    transform_abc.unit AS "unit"
FROM fct_table_abc transform_abc
WHERE
    (
        transform_abc.is_charged > 0
        OR transform_abc.account_status = 0
    )
    AND transform_abc.ds = '2020-02-20'
GROUP BY
    transform_abc.ds,
    transform_abc.unit"""


a = re.sub("SELECT[\s]+([a-zA-Z0-9.])+_([a-zA-Z0-9.])+.ds", "SELECT ", a)

a = re.sub("SELECT[\s]+[a-zA-Z]+[\s]+(\")ds(\",)","SELECT ",a)

a = res.sub("GROUP BY[\s]+([a-zA-Z0-9.])+_([a-zA-Z0-9.])+.ds,","GROUP BY ",a)

a будет содержать конечный ожидаемый результат

Спасибо КМ

...