[Fixed]-Python regex with question mark literal


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

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').


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.


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
      # No code!


“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:



supress the regex metacharacters with []

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

Leave a comment