[Fixed]-Python regex with question mark literal

15👍

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

The reason /aaa?aaa won’t match inside your URL is because a ? begins a new GET query.

So, the matchable part of the URL is only up to the first ‘aaa’. The remaining ‘?aaa’ is a new query string separated by the ‘?’ mark, containing a variable “aaa” being passed as a GET parameter.

What you can do here is encode the variable before it makes its way into the URL. The encoded form of ? is %3F.


You should also not match a GET query such as /?code=authenticationcode using regex at all. Instead, match your URL up to / using r'^$'. Django will pass the variable code as a GET parameter to the request object, which you can obtain in your view using request.GET.get('code').

2👍

You are not allowed to use ? in a URL as a variable value. The ? indicates that there are variables coming in.

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

Replace it or escape it. Here’s some nice documentation.

1👍

Django’s urls.py does not parse query strings, so there is no way to get this information at the urls.py file.

Instead, parse it in your view:

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

0👍

“How to match the ‘?’, is it special?”
Yes, but you are properly escaping it by using the backslash. I do not see where you have accounted for the leading forward slash, though. That bit just needs to be added in:

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

0👍

supress the regex metacharacters with []

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

Leave a comment