Регулярное выражение 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',)