首页 > 解决方案 > python 正则表达式从ddl获取列详细信息

问题描述

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”字样但没有其他内容的详细信息。添加“?” 在这个正则表达式的末尾,它获取了我儿子不需要的细节。

如何实现这一目标。

附上正则表达式101链接:

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

标签: regexpython-2.7

解决方案


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

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

在 regex101.com 上查看演示并注意修饰符。


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

  1. 递归地获取第一个(和第一个块)
  2. 用上面的表达式减去第一行来分析那个块

推荐阅读