【问题标题】:How to remove .ds patterned string from a string using python如何使用python从字符串中删除.ds模式字符串
【发布时间】:2020-08-15 14:20:57
【问题描述】:

我有这个字符串

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"""

我需要在 SELECT 和 GROUP BY 之后从这个字符串中删除带有 ds 的列,而不是在 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_abc 只是一个表名,它可以是任何表名。所以我们不能在正则表达式中使用它。 不知道如何解决这个问题

【问题讨论】:

    标签: python regex regex-lookarounds regexp-replace


    【解决方案1】:

    这里有一个方法:

    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
    

    Demo & explanation


    如果 SQL 在一行上,请使用:

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

    Demo & explanation

    【讨论】:

    • 可以格式化也可以不格式化。例如从 fct_table_abc transform_abc WHERE (transform_abc.is_charged > 0 OR transform_abc.account_status = 0) 和 transform_abc.ds = ' 2020-02-20' GROUP BY transform_abc.ds,ransform_abc.unit
    • @analyst:你的意思是单行吗?喜欢this
    【解决方案2】:

    请在下面找到解决方案。这可能在语法上不正确,没有编译它,但应该在逻辑上工作。

    #!/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 将包含最终的预期结果

    感谢KM

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2012-07-31
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多