为了账号安全,请及时绑定邮箱和手机立即绑定

Python Regex 获取索引名和列名

Python Regex 获取索引名和列名

慕勒3428872 2021-09-11 21:03:05
对于以下每个输入行,我需要获取索引名称和列名称。PRIMARY INDEX FIRST_ONE ( PLATFORM_CD ,SYSTEM_NAME ,DB_NAME ,TABLE_NAME ,COLUMN_NAME );) PRIMARY INDEX SECOND_ONE ( Hq_Id);PRIMARY INDEX THIRD_ONE ( DB_NAME ,BU_NAME );PRIMARY INDEX FOURTH_ONE ( DB_NAME ,TABLE_NAME ,COLUMN_NAME,  PII_CD);UNIQUE PRIMARY INDEX FIFT_ONE( DB_NAME,PRIMARY_SYSTEM_NAME);例如对于第一行我需要得到的输入:index name : FIRST_ONEcolumn1 : PLATFORM_CDcolumn2 : SYSTEM_NAMEcolumn3 : DB_NAMEcolumn4 : TABLE_NAMEcolumn5 : COLUMN_NAME我编写的正则表达式能够选择列名。正则表达式是:(?:(?<=,|\())\s*(\w+)\s*(?:\s*(\w+)\s*)?我应该做哪些更改才能获取索引名称?任何人都可以建议一个正则表达式。我是正则表达式的初学者。正则表达式需要为我提供的每种输入格式提供输出。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

除了正则表达式,您还可以使用sqlparse并拆分字符串:


import sqlparse

stmts = """PRIMARY INDEX FIRST_ONE ( PLATFORM_CD ,SYSTEM_NAME ,DB_NAME ,

TABLE_NAME ,COLUMN_NAME );

) PRIMARY INDEX SECOND_ONE ( Hq_Id);

PRIMARY INDEX THIRD_ONE ( DB_NAME ,BU_NAME );

PRIMARY INDEX FOURTH_ONE ( DB_NAME ,TABLE_NAME ,COLUMN_NAME,  PII_CD);

UNIQUE PRIMARY INDEX FIFT_ONE( DB_NAME,PRIMARY_SYSTEM_NAME);"""


for stmt in sqlparse.split(stmts):

    res = sqlparse.parse(stmt)   # parses each statement

    for tok in (res[0].tokens):  # iterate all tokens

        if isinstance(tok, sqlparse.sql.Function):

            idx, columns = str(tok).split('(')

            cols = [c.strip() for c in columns[:columns.find(')')].split(',')]

            print (idx.strip(),  cols)

返回:


FIRST_ONE ['PLATFORM_CD', 'SYSTEM_NAME', 'DB_NAME', 'TABLE_NAME', 'COLUMN_NAME']

SECOND_ONE ['Hq_Id']

THIRD_ONE ['DB_NAME', 'BU_NAME']

FOURTH_ONE ['DB_NAME', 'TABLE_NAME', 'COLUMN_NAME', 'PII_CD']

FIFT_ONE ['DB_NAME', 'PRIMARY_SYSTEM_NAME']


查看完整回答
反对 回复 2021-09-11
?
智慧大石

TA贡献1946条经验 获得超3个赞

splash58 提到的正则表达式有效..

\w+(?=\s*()|(?:(?<=,|())\s*(\w+)\s*(?:\s*(\w+)\s*)?


查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信