python regex从ddl获取列详细信息

时间:2019-02-11 07:52:33

标签: regex python-2.7

USE test_db2
CREATE  TABLE test_table2
(
    Subscn_Purch_Id                 BIGINT COMMENT 'from deserializer',
    Price_Amt                       DECIMAL(38,18),           
    Purch_Line_Item_Id              BIGINT,  
    Subscn_Purch_Status_Id          BIGINT COMMENT 'from defdf',
    Offer_Coupon_Id                 BIGINT,    -- INTRO OFFER
    Offer_Period_Hrs                BIGINT,
    discount_offer_id               STRING     -- DISCOUNT
)
PARTITIONED BY ( 
testcol bigint
)
ROW FORMAT SERDE 
  'eeee' 
STORED AS INPUTFORMAT 
  'rrrr' 
OUTPUTFORMAT 
  'tttt';
从上面的DDL中

我需要获取列级别的详细信息。 即 列名 数据类型, 数据长度(如果有) 数据精度(如果有) 专栏评论(如果有的话)

我不需要上面示例中的注释详细信息,例如“-INTRO OFFER”和“-DISCOUNT”。

我尝试使用正则表达式

\s*(\w+)\s*(\w+)(?:\s*\,\s*)?(?:\((\d+)(?:,\s?(\d+))?\))?(?:\s*\,\s*)?(?:(?=(?:.*COMMENT\s*)\'(.*)\'(?:\,|\))))

此正则表达式在提取'?'时获取其中带有'COMEMNT'单词的详细信息,但不提取其他内容。在此正则表达式的末尾,它获取了我儿子不需要的详细信息。

如何实现这一目标。

附加regex101链接:

https://regex101.com/r/QfOCfj/3

2 个答案:

答案 0 :(得分:0)

通常,尝试使用正则表达式解析这些字符串通常不是一个好主意。话虽如此,您可以尝试使用支持regex的更新的\G模块:

(?:\G(?!\A)|\()
\s*
(?P<column_name>\w+)\s+
(?P<column_type>\w+)
(?:
    \(
    (?P<column_size>[^()]+)
    \)
)?
[, ]+
.*

请参见a demo on regex101.com,并注意修饰符。


或者-如果不能安装另一个模块-使用两个表达式:

  1. 首先以递归方式获取()的每个块
  2. 使用上面的表达式减去第一行来分析该块

答案 1 :(得分:0)

@Jan的正则表达式可能会为您提供所需的东西,但是可能有更清洁的方法来解决此问题。您可以尝试直接在DB2中查询信息模式表。

SELECT
    COLNO,
    SYSTEM_COLUMN_NAME,
    DATA_TYPE, 
    COALESCE(PRECISION, LENGTH) AS length,
    SMALLINT(SCALE) AS scale,
    STORAGE
FROM QSYS2/SYSCOLUMNS
WHERE
    SYSTEM_TABLE_SCHEMA = 'your_db' AND
    SYSTEM_TABLE_NAME   = 'test_table2';