Python Regex获取索引名称和列名称

时间:2018-12-10 12:18:46

标签: python regex

对于以下每个输入行,我需要获取索引名称和列名称。

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_ONE
column1 : PLATFORM_CD
column2 : SYSTEM_NAME
column3 : DB_NAME
column4 : TABLE_NAME
column5 : COLUMN_NAME

我写的正则表达式可以选择列名。 正则表达式是:

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

我还应该进行哪些更改以获取索引名称? 任何人都可以建议使用正则表达式。 我是regex的初学者。 regex需要为我提供的每种输入格式提供输出。

3 个答案:

答案 0 :(得分:0)

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

model

返回:

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)

答案 1 :(得分:0)

这可以正常工作,前提是您在表格列列表中的逗号后没有空格。

((?<=INDEX\s)[a-zA-Z_]+)|(?<=\(\s|)[a-zA-Z_]+

第一组将返回索引名称。后面的列在不同的列中。

说明:

  • 向后查找INDEX加空格
  • 第1组:由字符a-z或A-Z或_
  • 组成的单词
  • 或者回头寻找括号“(”
  • 第2组到x:由a-z或A-Z或_
  • 组成的单词

查看示例:https://regex101.com/r/AkIrcF/1

答案 2 :(得分:0)

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

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