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

๐Ÿ‘คAnuj Gupta

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!
๐Ÿ‘คBurhan Khalid

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>.*)$'
๐Ÿ‘คKenneth K.

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