Регулярное выражение для анализа строк - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать список значений столбцов и типов объявлений в Python на основе этой строки, которая является запросом на создание SQL:

creation_sql = '''CREATE TABLE "objects_users" (
    "id" serial NOT NULL PRIMARY KEY, 
    "clientID" integer NOT NULL, 
    "email" varchar(100) NOT NULL, 
    "first_name" varchar(100) NOT NULL, 
    "last_name" varchar(100) NOT NULL, 
    "phone" varchar(100) NOT NULL, 
    "password" varchar(100) NOT NULL, 
    "type" varchar(100) NOT NULL, 
    "date_created" timestamp with time zone NOT NULL, 
    "active" varchar(100) NOT NULL);'''

Я уже проанализировал значения в кавычках из выражениявот так:

def parse(creation_query):

    quoted_values = re.compile('"[^"]*"')
    values = quoted_values.findall(creation_sql)

    column_names = []
    for value in values:
        column_names.append(value)

    table_name = column_names[0]
    column_names = [names.replace('"','') for names in column_names]

    del column_names[0]         # this will be table name
    print(table_name)
    print(column_names)

Как мне разобрать значения типа SQL из каждой строки?

Например, я уже собрал id и clientID в списке.Теперь я хочу объявление, serial NOT NULL PRIMARY KEY и integer NOT NULL, и т.д ... в списке.

Как я могу выполнить этот тип анализа?Я бы лучше сказал, но я могу понять это самостоятельно, мне просто нужно регулярное выражение

Обновление

Вот обновленный код, который предоставляет мне словарь всегоМне нужно на основе утверждения creation_sql:

import re

creation_sql = '''CREATE TABLE "objects_users" (
    "id" serial NOT NULL PRIMARY KEY, 
    "clientID" integer NOT NULL, 
    "email" varchar(100) NOT NULL, 
    "first_name" varchar(100) NOT NULL, 
    "last_name" varchar(100) NOT NULL, 
    "phone" varchar(100) NOT NULL, 
    "password" varchar(100) NOT NULL, 
    "type" varchar(100) NOT NULL, 
    "date_created" timestamp with time zone NOT NULL, 
    "active" varchar(100) NOT NULL);'''

def parse(creation_query):

    quoted_values = re.compile('"[^"]*"')
    table_name = quoted_values.findall(creation_query)[0]

    dictionary_values = dict(re.findall('"(.*?)"\s+(.+)[,)]', creation_query))
    dictionary_values['table_name'] = table_name.replace('"','')

    return dictionary_values

d = parse(creation_sql)
print(d.get('table_name'))
for key, item in d.items():
    if key != 'table_name':
        print(key + ":"+ item)

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте это:

import re
r = re.findall('"(.*?)"\s+(.+)?[,)]', creation_sql)

print(dict(r))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...