带有问号文字的 Python 正则表达式
Posted
技术标签:
【中文标题】带有问号文字的 Python 正则表达式【英文标题】:Python regex with question mark literal 【发布时间】:2012-09-27 19:57:48 【问题描述】:我正在使用 Django 的 URLconf,我将收到的 URL 是/?code=authenticationcode
我想使用 r'^\?code=(?P<code>.*)$'
匹配 URL,但它不起作用。
然后我发现这是'?'的问题。
因为我尝试使用 r'aaa\?aaa'
r'aaa\\?aaa'
甚至 r'aaa.*aaa'
匹配 /aaa?aaa
,都失败了,但是当它是“+”或任何其他字符时它可以工作。
'?'怎么配,有没有特别的?
【问题讨论】:
【参考方案1】:>>> 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】:Django 的urls.py
不解析查询字符串,因此无法在urls.py
文件中获取此信息。
相反,在你的视图中解析它:
def foo(request):
code = request.GET.get('code')
if code:
# do stuff
else:
# No code!
【讨论】:
【参考方案3】:使用[]
抑制正则表达式元字符
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)
【讨论】:
当他决定以这种方式“抑制”元字符时会发生什么:[^?$]
?逃避是更好的方法。【参考方案4】:
“如何匹配'?',有什么特别的吗?” 是的,但是您通过使用反斜杠正确地转义了它。不过,我看不出你在哪里解释了前导斜杠。那一点只需要添加:
r'^/\?code=(?P<code>.*)$'
【讨论】:
【参考方案5】:您不能在 URL 中使用 ?
作为变量值。 ?
表示有变量进来。
点赞:http://www.example.com?variable=1&another_variable=2
替换它或逃避它。这是一些不错的documentation。
【讨论】:
以上是关于带有问号文字的 Python 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符