Django:组名不好

时间:2013-03-03 07:39:08

标签: python regex django django-views django-errors

我在“坏组名”上遇到错误。

以下是代码:

for qitem in q['display']:
    if qitem['type'] == 1:
        for keyword in keywordTags.split('|'):
            p = re.compile('^' + keyword + '$')
            newstring=''
            for word in qitem['value'].split():
                if word[-1:] == ',':
                    word = word[0:len(word)-1]
                    newstring += (p.sub('<b>'+word+'</b>', word) + ', ')
                else:
                    newstring += (p.sub('<b>'+word+'</b>', word) + ' ')
            qitem['value']=newstring

这是错误:

  / result / 1 /的错误

  坏组名   请求方法:GET   Django版本:1.4.1   异常类型:错误   例外值:坏组名称   异常位置:_compile_repl中的C:\ Python27 \ lib \ re.py,第257行   Python可执行文件:C:\ Python27 \ python.exe   Python版本:2.7.3 Python   路径:['D:\ ExamPapers','C:\ Windows \ SYSTEM32 \ python27.zip',   'C:\ Python27 \ DLLs','C:\ Python27 \ lib',   'C:\ Python27 \ lib \ plat-win','C:\ Python27 \ lib \ lib-tk',   'C:\ Python27','C:\ Python27 \ lib \ site-packages']   服务器时间:太阳,2013年3月3日15:31:05 +0800

     

回溯切换到复制并粘贴视图

     get_response中的

C:\ Python27 \ lib \ site-packages \ django \ core \ handlers \ base.py   response = callback(request,* callback_args,** callback_kwargs)...▶本地变量?   D:\ ExamPapers \ views.py的结果   newstring + =(p.sub(''+ word +'',word)+'')...▶本地变量

总之,错误发生在:

newstring += (p.sub('<b>'+word+'</b>', word) + ' ')

1 个答案:

答案 0 :(得分:1)

因此,您尝试以粗体突出显示一组关键字。现在这个代码在很多方面被打破了。您现在正在使用re模块来匹配关键字,但您也将关键字和字符串分解为单个字词,您不需要同时执行这两个操作,并且这两种不同方法之间的交互也是如此解决问题是导致问题的原因。

您可以使用正则表达式同时匹配多个可能的字符串,这就是它们的优点!因此,您可以使用"^keyword$"来匹配 “keyword”或“hello”,而不是"^keyword|hello$"来匹配“关键字”。您还使用仅与整个字符串的开头或结尾匹配的^$字符,但您最初可能想要的是匹配单词的开头或结尾,为此您可以使用{ {1}}像这样\b。请注意,在最后一个示例中,我在字符串之前添加了一个r"\b(keyword|hello)\b"字符,这代表“raw”并关闭pythons通常处理与正则表达式冲突的反斜杠字符,始终<< / em>当字符串包含正则表达式时,在字符串前使用r。我还用括号将这些词组合在一起。

正则表达式r方法允许您将正则表达式匹配的内容替换为另一个字符串。它还允许您在替换字符串中创建“返回引用”,其中包含匹配的原始字符串的部分。它包含的部分称为“组”,并在原始正则表达式中用括号表示,在上面的示例中,只有一组括号,这些是第一组,因此它们由后引用{{1}指示}。您询问的实际错误消息的原因是您的替换字符串包含的内容类似于backref,但正则表达式中没有任何组。

使用它你可以这样做:

sub

另一个与您所要求的内容没有直接关系但又非常重要的是您正在使用源纯文本字符串(我假设)并将它们转换为HTML,这为脚本注入漏洞提供了大量机会如果你没有花时间去理解和避免将允许坏人破解你构建的应用程序(他们可以自动化的方式做到这一点,所以即使你认为你的应用程序太小,任何人都没有注意到它可以仍然被黑客攻击并用于各种不好的事情,不要让这种情况发生!)。基本规则是可以将文本转换为HTML,但是你需要首先“转义”它,这很简单:

\1

所有这一切都会将keywordMatcher = re.compile(r"\b(keyword|hello)\b") value = keywordMatcher.sub(r"<b>\1</b>", value) 等字符转换为from django.utils import html html_safe = html.escape(my_text) ,浏览器将显示为<,但不会将其解释为标记的开头。因此,如果一个坏人在您的某个表单中键入&lt;并且它会被您的代码处理,它将显示为<而不会将其作为脚本执行。

同样,如果你在正则表达式中使用一个你不打算使用特殊正则表达式字符的文本,那么你也必须逃避它!您可以使用<script>

执行此操作
<script>

好的,现在我们已经解决了这个方法,你可以用来做你想做的事情:

re.escape

我劝你花时间去理解这是什么,否则你只会让自己变得一团糟!剪切和粘贴并继续前进总是比较容易,但是这会导致破旧的代码,更糟糕的是,你自己不会改进,也不会学习。所有伟大的程序员都是初学者,他们花时间去理解事情:)