2012-10-07 16 views
11

estoy usando URLconf de Django, la URL voy a recibir es /?code=authenticationcode
Quiero coincidir con la URL usando r'^\?code=(?P<code>.*)$', pero no funciona.
expresiones regulares de Python con signo de interrogación literal

Luego descubrí que es el problema de '?'.
Porque traté de hacer coincidir /aaa?aaa usando r'aaa\?aaa'r'aaa\\?aaa' incluso r'aaa.*aaa', todos fallaron, pero funciona cuando es "+" o cualquier otro caracter.
¿Cómo hacer coincidir el '?', ¿Es especial?

Respuesta

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

La razón /aaa?aaa no coincidirá con el interior de su URL es debido a que un ? comienza una nueva consulta GET.

Por lo tanto, la parte correspondiente de la URL solo corresponde al primer 'aaa'. El'aaa 'restante es una nueva cadena de consulta separada por el'? ' marca, que contiene una variable "aaa" que se pasa como un parámetro GET.

Lo que puede hacer aquí es codificar la variable antes de que llegue a la URL. La forma codificada de ? es %3F.


También debe no coincide con una consulta GET como /?code=authenticationcode usando expresiones regulares en absoluto. En su lugar, haga coincidir su URL hasta / usando r'^$'. Django pasará la variable code como un parámetro GET al objeto request, que puede obtener en su vista usando request.GET.get('code').

2

No tiene permitido utilizar ? en una URL como valor variable. El ? indica que hay variables que entran

igual:. http://www.example.com?variable=1&another_variable=2

Reemplazar o escapar de ella. Aquí hay algunos buenos documentation.

0

"¿Cómo hacer coincidir el '?', ¿Es especial?" Sí, pero está escapando correctamente utilizando la barra diagonal inversa. Sin embargo, no veo dónde has contabilizado el corte adelantado. Esa parte sólo necesita ser añadido en:

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

-supress los metacaracteres de expresiones regulares con []

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

¿Qué ocurre cuando (s) que decide "suprimir" los meta-caracteres de esta manera: '[?^$]'? Escapar sería el mejor enfoque. –

1

de urls.py no analiza las cadenas de consulta, por lo que no hay manera de obtener esta información en el archivo urls.py Django .

En cambio, analizarlo en su opinión:

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