Регулярное выражение для соответствия следующему шаблону в SQL-запросе

#python #mysql #regex

#python #mysql #регулярное выражение

Вопрос:

Я пытаюсь извлечь части запроса MySQL, чтобы получить нужную мне информацию.

Я использовал этот код / регулярное выражение в Python:

 import re
query = "SELECT `asd`.`ssss` as `column1`, `ss`.`wwwwwww` from `table`"
table_and_columns = re.findall('`.*?`[.]`.*?`',query)
  

Мой ожидаемый результат:

 ['`asd`.`ssss`', `ss`.`wwwwwww`']
  

Мой реальный результат:

 ['`asd`.`ssss`', '`column1`, `ss`.`wwwwwww`']
  

Кто-нибудь может мне помочь и объяснить, где я ошибся?
Регулярное выражение должно находить только те, которые имеют две строки типа asd и точку посередине.

PS: Я знаю, что это недопустимый запрос.

Ответ №1:

Точка . также может соответствовать обратному значению, поэтому шаблон начинается с сопоставления обратного значения и способен сопоставлять все символы, пока не достигнет буквальной точки в [.]

Нет необходимости использовать не жадные квантификаторы, вы можете использовать отрицаемый символьный класс, только предотвращающий пересечение границы обратного перехода.

 `[^`]*`.`[^`]*`
  

Демонстрация регулярных выражений

Звездочка * совпадает 0 или более раз. Если должен быть хотя бы один символ, а новые строки и пробелы нежелательны, вы можете добавить, s чтобы предотвратить совпадение символов пробелов и использовать для сопоставления 1 или более раз.

 `[^`s] `.`[^`s] `
  

Демонстрация регулярных выражений | Демонстрация Python

Например

 import re
query = "SELECT `asd`.`ssss` as `column1`, `ss`.`wwwwwww` from `table`"
table_and_columns = re.findall('`[^`s] `.`[^`s] `',query)
print(table_and_columns)
  

Вывод

 ['`asd`.`ssss`', '`ss`.`wwwwwww`']
  

Ответ №2:

Пожалуйста, попробуйте приведенное ниже регулярное выражение. Жадный характер .* слева направо — вот что вызвало проблему.
Вместо этого вы должны выполнить поиск [^`]*

 `[^`]*?`.`[^`]*?`
  

ДЕМОНСТРАЦИЯ

Ответ №3:

Дело в том, что .*? соответствует любому символу (кроме символов завершения строки), даже пробелам. Также, поскольку вы уже используете * , что означает либо 0, либо неограниченное количество случаев, не уверен, что вам нужно использовать ? . Похоже, это работает:

 `S `[.]`S `
  

где S — любой символ, не содержащий пробелов.
Вы всегда можете проверить свои регулярные выражения с помощью https://regex101.com