Python正则表达式中的问号字面量

13
我正在使用Django的URLconf,我将收到的URL是/?code=authenticationcode
我想使用r'^\?code=(?P<code>.*)$'进行匹配,但它无法正常工作。

然后我发现这是'?'的问题。
因为我试图使用r'aaa\?aaa' r'aaa\\?aaa' 甚至 r'aaa.*aaa' 匹配/aaa?aaa,都失败了,但在其他字符中它却有效。
如何匹配'?',它是否特殊?

5个回答

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

/aaa?aaa 无法在你的URL中匹配,因为?表示一个新的GET查询。

因此,URL中可以匹配的部分仅限于第一个'aaa'。剩余的'?aaa'是以'?'标记分隔的新的查询字符串,其中包含传递为GET参数的变量"aaa"。

在将变量编码进入URL之前,您可以对其进行编码。 ?的编码形式为%3F


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


2

在URL中,您不被允许使用?作为变量值。 ?表示有变量进入。

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

请更改或转义它。这里有一些不错的文档


1

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

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

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

0

使用[]来抑制正则表达式元字符。

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

1
当他决定以这种方式“抑制”元字符时,会发生什么:[^?$]?转义是更好的方法。 - Kenneth K.

0
"

如何匹配'?',它是特殊字符吗?" 是的,但是您可以通过使用反斜杠进行正确转义。不过我没有看到您考虑前导正斜杠的地方。这一点只需要添加即可:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接