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

loading...


0

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

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*)?

我应该做什么改变才能获得索引名称?任何人都可以建议正则表达式 . 我是正则表达式的初学者 . 正则表达式需要为我提供的每种输入格式提供输出 .

3回答

  • 0

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

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


  • 0

    除了正则表达式,你可以使用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']
    

  • 0

    假设您在表列列表中的逗号之后没有任何空格,这可以正常工作)

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

    第一组将返回索引名称 . 随后的不同列 .

    说明:

    • 回顾查找INDEX加空格

    • Group1:由字符a-z或A-Z或_组成的单词

    • 或者回头找一个支架"("

    • Group2到x:由字符a-z或A-Z或_组成的单词

    见例子:https://regex101.com/r/AkIrcF/1

评论

loading...

暂时没有评论!