Python Regex получает имя индекса и имена столбцов - PullRequest
0 голосов
/ 10 декабря 2018

Для каждой из следующих строк ввода мне нужно получить имя индекса и имена столбцов.

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 голосов
/ 10 декабря 2018

Это работает, если у вас нет пробелов после запятых в списке столбцов таблицы)

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

Первая группа вернет имя индекса.Последующие - разные столбцы.

Объяснение:

  • Обратный просмотр, чтобы найти INDEX плюс пробел
  • Group1: слово, состоящее из символов az или AZ или _
  • Или оглянуться назад, чтобы найти скобки "("
  • Group2 to x: слово, состоящее из символов az или AZ или _

См. Пример: https://regex101.com/r/AkIrcF/1

0 голосов
/ 11 декабря 2018

Regex, упомянутый в splash58, работает ..

\ w + (? = \ S * () | (?: (? <=, | ()) \ S * (\ w +) \ s *(?: \ S * (\ W +) \ S *) </p>?

0 голосов
/ 10 декабря 2018

Рядом с регулярным выражением вы можете использовать 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...