#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