对于以下每个输入行,我需要获取索引名称和列名称。
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需要为我提供的每种输入格式提供输出。
答案 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_]+
第一组将返回索引名称。后面的列在不同的列中。
说明:
答案 2 :(得分:0)
splash58提到的正则表达式有效..
\ w +(?= \ s *()|(?:(?<=,|())\ s *(\ w +)\ s *(?:\ s *(\ w +)\ s *) ?