带有问号文字的 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&amp;another_variable=2

替换它或逃避它。这是一些不错的documentation。

【讨论】:

以上是关于带有问号文字的 Python 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

求一去乱码、汉字的正则表达式

python正则表达式

使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符

将在关键字之后和问号之前匹配的正则表达式

两万文字详解Python正则表达式(语法验证方法使用案例练习题常见错误)

Python 正则表达式 贪心匹配和非贪心匹配