带有问号文字的Python正则表达式

时间:2012-10-07 07:31:39

标签: python regex django

我正在使用Django的URLconf,我将收到的网址为/?code=authenticationcode
我想使用r'^\?code=(?P<code>.*)$'匹配网址,但它不起作用。

然后我发现它是'?'的问题。
因为我尝试使用/aaa?aaa r'aaa\?aaa'甚至r'aaa\\?aaa'来匹配r'aaa.*aaa',但都失败了,但是当它是“+”或任何其他角色时它会起作用。
如何匹配'?',这是特别的吗?

5 个答案:

答案 0 :(得分:14)

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

/aaa?aaa在您的网址中不匹配的原因是因为?开始新的GET查询。

因此,URL的匹配部分仅限于第一个'aaa'。剩下的'?aaa'是一个由'?'分隔的新查询字符串 mark,包含作为GET参数传递的变量“aaa”。

?的编码形式为%3F


您也应该使用正则表达式来匹配/?code=authenticationcode等GET查询。相反,请使用/将您的网址与r'^$'匹配。 Django会将变量code作为GET参数传递给request对象,您可以使用request.GET.get('code')在视图中获取该对象。

答案 1 :(得分:2)

您不能在URL中使用?作为变量值。 ?表示存在变量。

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

更换或逃脱它。这里有一些不错的documentation

答案 2 :(得分:1)

Django的urls.py不解析查询字符串,因此无法在urls.py文件中获取此信息。

相反,请在您的视图中解析它:

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

答案 3 :(得分:0)

“如何匹配'?',这是特别的吗?” 是的,但是你通过使用反斜杠正确地逃避了它。但是,我没有看到你在哪里占据了领先的正斜线。这一点只需要添加:

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

答案 4 :(得分:0)

使用[]

来抑制正则表达式元字符
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)