Как принять. в регулярном выражении URL и до сих пор исключить формат - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь создать шаблон регулярного выражения для lookup_value_regex на django-rest-framework API, который принимает URL, такие как:

/alice_test
/alice_test.json
/alice.test
/alice.test.json
/alice_test.so@gmail.com
/alice_test.so@gmail.com.json

PS: username после / можетсодержит _. @ - в любой точке.

и правильно определяет, когда использовать формат json для возврата ответа. В настоящее время я пытался изменить lookup_value_regex в моем Viewset следующим образом.

class UserViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    lookup_field = 'username'
    lookup_value_regex = r'(?<=/)[\w.@+-]+?(?=\.json|\.csv|\.xml|$)'

Эта реализация при тестировании с моими примерами путей, приведенными выше, возвращает следующие значения поиска

/alice_test # alice_test -- OK
/alice_test.json # alice_test.json -- NOT OK
/alice.test # alive.test -- OK
/alice.test.json # alice.test.json -- NOT OK
/alice_test.so@gmail.com # alice_test.so@gmail.com -- OK
/alice_test.so@gmail.com.json # alice_test.so@gmail.com.json -- NOT OK

Howзаставить lookup_value_regex работать и правильно выбирать, когда он должен использовать формат ответа?

В конечном итоге я пытаюсь повторить функциональность регулярного выражения [^/.]+, но в этом случае он должен принять. и сможете различать имя пользователя и формат. Так, чтобы сгруппировать регулярное выражение следующим образом: (?P<username>[^/.]+), а затем добавить \.(?P<format>[a-z0-9]+) к регулярному выражению, сделав его (?P<username>[^/.]+)\.(?P<format>[a-z0-9]+), правильно выберет username и format.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Я сделал это:

(?:\/([\w-\.]+)@?(?:[\w-\.]+)?.((?:json)|(?:xml)|(?:csv)))$|(?:\/([\w-\.]+)@?(?:[\w-\.]+)?)

Regex101

Если у вас есть что-то в группе 3, это пользователь, и это означает, что вы нене соответствует ни одному формату. Если у вас есть что-то в группе 1, то это пользователь, а в группе 2 это формат.

0 голосов
/ 30 октября 2019

Вы можете попробовать это регулярное выражение

(\/\w*){2}\/\w*[._]?\w*(\@)?\w*(\.\w*)*

регулярное выражение 101

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...