Выполнение поиска регулярных выражений в строке запроса sql python 3.x

Я хотел бы узнать, встречается ли select some_col_name, * , some_col_name from table_name в строке запроса, например, в примере ниже:

select some_col_name, *, some_col_names
from table_name

or

select some_col_name, 
*, some_col_name
from 
table_name

Пока что я могу сопоставить только select some_col_names, *, используя

re.search("select(\s*.*?)*\*", query_string)

Как мне сопоставить нужное выражение? Я хотел бы остановиться после сопоставления с первым вхождением.


person obiigbe91    schedule 22.02.2019    source источник
comment
Это попахивает проблемой XY. почему ты хочешь сделать это? Дело не в том, что это невозможно, но, вероятно, это не правильный способ делать то, что вы пытаетесь сделать.   -  person Adam Smith    schedule 23.02.2019
comment
Вы хотите найти все запросы, которые выбирают * в качестве столбца?   -  person Bohemian♦    schedule 23.02.2019
comment
Учитывая запрос, я хочу знать, пытался ли пользователь выбрать все столбцы в определенном имени таблицы (используя select * вместо упоминания имени столбца). Но обратите внимание, что строка запроса может содержать несколько операторов select из-за любого использования WITH.   -  person obiigbe91    schedule 23.02.2019


Ответы (1)


Попробуйте это регулярное выражение:

select([^*](?!from))*\*([^*](?!from))* from[\s\r\n]*table_name

См. демонстрацию.

Это будет соответствовать нескольким строкам, но из-за отрицательного просмотра вперед не будет переходить от select одного запроса к from более позднего запроса.

person Bohemian♦    schedule 22.02.2019
comment
Спасибо @Bohemian, но я также хочу добавить к совпадению конкретное имя таблицы. Ваш пример соответствует только до from. Кроме того, я хочу останавливаться только при первом появлении. - person obiigbe91; 23.02.2019
comment
@ obiigbe91 Я добавил имя таблицы в регулярное выражение. Если вы хотите сопоставить только сначала, см. этот ответ, как это сделать. - person Bohemian♦; 23.02.2019