regex - 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链接:
解决方案
通常,尝试使用正则表达式解析这些字符串通常不是一个好主意。话虽如此,您可以尝试使用regex
支持的较新模块\G
:
(?:\G(?!\A)|\()
\s*
(?P<column_name>\w+)\s+
(?P<column_type>\w+)
(?:
\(
(?P<column_size>[^()]+)
\)
)?
[, ]+
.*
在 regex101.com 上查看演示并注意修饰符。
或者 - 如果安装另一个模块不是一个选项 - 使用两个表达式:
- 递归地获取第一个
(
和第一个块)
- 用上面的表达式减去第一行来分析那个块
推荐阅读
- node.js - NodeJS express 上的路由器
- javascript - 即使在启用标头后,PayPal节点sdk也会导致CORs错误“预检请求不允许重定向”
- excel - 多个 IF 的 Excel 函数
- katalon-studio - 无法通过使用 katalon studio 启动应用程序,出现如下错误:
- angular - 如何不重新渲染所有 RadListView 项目
- sql - 如何在 SQL 中的动态列表上使用 IN 子查询?
- javascript - 在rails + javascript中单击单选按钮时显示文本字段
- tensorflow - CNN vs SVM 用于微笑强度检测训练?
- javascript - 如何在 ES6 模块节点应用程序中包含 commonjs 模块?
- loops - Perl:向 foreach 循环添加异常