Регулярное выражение Python с вопросительным знаком literal

Я использую URL-адрес Django, URL-адрес, который я получу, /?code=authenticationcode
Я хочу сопоставить URL с помощью r'^\?code=(?P<code>.*)$', но он не работает.

Тогда я узнал, что это проблема "?".
Becuase Я попытался сопоставить /aaa?aaa с помощью r'aaa\?aaa' r'aaa\\?aaa' even r'aaa.*aaa', все провалились, но он работает, когда он "+" или любой другой символ.
Как сопоставить "?", Это специальный?

Ответ 1

>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']

Причина /aaa?aaa не будет совпадать внутри вашего URL-адреса, потому что ? начинает новый запрос GET.

Итак, подходящая часть URL-адреса только до первой "aaa". Оставшаяся '? Aaa' - это новая строка запроса, разделенная символом '?' mark, содержащий переменную "aaa", передаваемую как параметр GET.

Что вы можете здесь сделать, это кодировать переменную, прежде чем она попадает в URL-адрес. Закодированная форма ? равна %3F.


Вы также не должны совпадать с запросом GET, например /?code=authenticationcode, с использованием regex. Вместо этого, сопоставьте свой URL до / с помощью r'^$'. Django передаст переменную code в качестве параметра GET в объект request, который вы можете получить в своем представлении, используя request.GET.get('code').

Ответ 2

Вы не можете использовать ? в URL как значение переменной. ? указывает, что есть переменные.

Нравится: http://www.example.com?variable=1&another_variable=2

Замените его или убегите. Вот несколько приятных документации.

Ответ 3

Django urls.py не анализирует строки запроса, поэтому нет способа получить эту информацию в файле urls.py.

Вместо этого проанализируйте его в своем представлении:

def foo(request):
   code = request.GET.get('code')
   if code:
      # do stuff
   else:
      # No code!

Ответ 4

"Как сопоставить"? ", это особенное?" Да, но вы экономите его, используя обратную косую черту. Тем не менее, я не вижу, где вы учитывали ведущую косую черту. Этот бит просто нужно добавить в:

r'^/\?code=(?P<code>.*)$'

Ответ 5

подавляет метасимволы регулярных выражений с помощью []

>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)