Регулярное выражение Python для вставок mysqldump

0

У меня есть куча запросов в строчном формате:

INSERT INTO users VALUES (1, 'пб', NULL, 'Пример пользователя', 'пример @примере', '', 'да', 1493878226, NULL, NULL, 'Дас', 'неприсвоенный', '', '', '', '', '', '', '', 1 '', NULL, '', NULL, '', '', '', '', 1,0,0,25495, NULL, '', '', 0,0,0, '', NULL, ''), (2, 'pb', NULL, 'User Example', 'example @example', '', 'a774f', 1493878226, NULL, NULL, 'устройство', 'неприсвоенный', '', '', '', '', '', '', '', 1 '', NULL, '', NULL, '', '', '', '', 0,0,0, NULL, NULL, '', '', 0,0,0 '', NULL, ''), (3, 'р =', NULL, 'Пользователь Пример", 'пример @примере', '', '95fa', 1493878226, NULL, NULL, 'устройство', 'б', '', '', '', '', '', '', '', 1, '', NULL, '', NULL, '', '', '', '', 0,0,0, NULL, NULL, '', '', 0,0,0 '', NULL, ''), (4, 'pa', NULL, 'User Example', 'example @example', '', 'ea1', 1493878226,1510178200, NULL, 'a', 'unsassigned', '', '', '', '', '', '', '', 1 '', NULL, '', NULL, '', '', '', '', 0,0,0, NULL, NULL, '', '', 0,1,0, '', NULL, ''), (5, 'рь', NULL, 'AAA', 'пример @пример', '', 'дас', 1493878226, NULL, NULL, 'а', 'неприсвоенный', '', '', 'dasmin.png', '', '', '', '', 1 '', NULL, '', NULL," ", '', '', '', 0,0,0, NULL, NULL, '', '', 0,0,0 '', NULL, '');

И то, что я хочу сделать, - это возможность разделять каждую часть разделенного текста на(), чтобы я мог перебирать их, изменять некоторые вещи, а затем делать ручную вставку.

Что я должен делать?

Кстати, я не очень хорошо разбираюсь в регулярных выражениях...

  • 0
    Можете ли вы опубликовать ожидаемый результат?
Теги:

2 ответа

0
Лучший ответ

Я немного работаю с Python и SQL, поэтому думаю, что знаю, что вы пытаетесь сделать. Попробуй это:

import re

sql_text = "INSERT INTO users VALUES (1,'pb',NULL,'User Example','example@example','','da',1493878226,NULL,NULL,'das','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',1,0,0,25495,NULL,'','',0,0,0,'',NULL,''),(2,'pb',NULL,'User Example','example@example','','a774f',1493878226,NULL,NULL,'device','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,''),(3,'p=',NULL,'User Example','example@example','','95fa',1493878226,NULL,NULL,'device','b','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,''),(4,'pa',NULL,'User Example','example@example','','ea1',1493878226,1510178200,NULL,'a','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,1,0,'',NULL,''),(5,'pb',NULL,'AAA','example@example','','das',1493878226,NULL,NULL,'a','unassigned','','','dasmin.png','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,'');"
sql_list = re.findall("\([^)]+\)", sql_text)
for sql_item in sql_list:
    print(sql_item)

Я беру текст SQL и regex каждый набор значений в список. Само регулярное выражение является ключевым, это отрицательный класс символов. Он соответствует каждому начальному парану вплоть до следующего закрывающего парана. [^)] + Означает все не закрывающие параны.

Очевидно, что вместо печати (sql_item) вы захотите изменить текст, но этого должно быть достаточно, чтобы вы начали.

Вот хороший сайт для игры с регулярными выражениями: https://www.regex101.com

  • 0
    Что, если есть ( или ) в середине значения, например query="INSERT INTO users VALUES (1,'pb',NULL,'User),( Example','example@example', ..."
  • 0
    В примере нет, но я понимаю, что вы говорите. Вы можете проверить созданный список длин, и если он верен, вы можете пойти. Если не попробовать что-то вроде разделения на:), (я бы попробовал это, прежде чем перерабатывать решение. Работа с регулярными выражениями часто бывает методом проб и ошибок.
Показать ещё 2 комментария
0

Если я правильно понял, что вам нужно, чтобы каждый из вставленных значений задавался отдельно, вы можете попробовать следующее:

import re
values = re.findall(r'(\(.*?\))', query) #this would match the '(' and ')' too
values = re.findall(r'\((.*?)\)', query) #if you don't want to capture the braces

Регулярное выражение найдет шаблоны между ( и ) с использованием .*. ? чтобы сделать поиск не жадным. в противном случае .* будет соответствовать до последнего )

  • 0
    Что, если в середине строки есть ( или ) , например query="INSERT INTO users VALUES (1,'pb',NULL,'User),( Example','example@example', ..."

Ещё вопросы

Сообщество Overcoder
Наверх
Меню