#python #django #regex #re
#python #django #регулярное выражение #python-re
Вопрос:
Я пытаюсь создать систему, в которой пользователи смогут определять и тестировать свои собственные шаблоны регулярных выражений. Для этого у меня есть следующая настройка:
import re
class ExtendedRegexValidator(models.Model):
pattern = models.TextField(
_('pattern'),
help_text=_('Required. Must be a valid regular expression pattern.')
)
def save(self, *args, **kwargs):
try:
re.compile(self.pattern)
except Exception as e:
# handle exception
super(ExtendedRegexValidator, self).save(*args, **kwargs)
Перед сохранением я пытаюсь скомпилировать шаблон регулярных выражений, используя значение pattern
поля модели, которое является TextField
. Действительно ли это необходимо? Есть ли более идеальный способ сделать это? Это своего рода хакерство.
Комментарии:
1. Выполните проверку при отправке формы. И да, некоторые шаблоны не будут скомпилированы.
Ответ №1:
Действительно ли это необходимо?
Да, проверка необходима, так как будут допустимые строки, которые не являются допустимыми регулярными выражениями. Смотрите документы Python на re.error
:
Исключение, возникающее, когда строка, переданная одной из функций здесь, не является допустимым регулярным выражением (например, она может содержать не совпадающие скобки) или когда возникает какая-либо другая ошибка во время компиляции или сопоставления.
Другие предлагали вместо этого выполнить эту проверку во время отправки формы, но ради целостности данных, я думаю, вы были правы, сделав это на уровне модели. При вашей обработке re.error
вы можете вызвать ValidationError
, которое может быть обнаружено на уровне отправки формы.
Есть ли более идеальный способ сделать это? Это своего рода хакерство.
Ваш код проверки соответствует философии Python EAFP:
Проще попросить прощения, чем разрешения. Этот распространенный стиль кодирования на Python предполагает существование допустимых ключей или атрибутов и улавливает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества операторов
try
иexcept
. Этот метод отличается от стиля LBYL, общего для многих других языков, таких как C.
Я также не вижу встроенного способа проверки строки как шаблона регулярных выражений без попытки ее использования или компиляции. Однако я бы предложил создать поле пользовательской модели для шаблонов регулярных выражений, чтобы вы могли инкапсулировать эту проверку и потенциально повторно использовать функциональность в других моделях.