Django:坏集团南

2024-09-28 22:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

代码如下:

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

错误就在这里:

error at /result/1/ bad group name Request Method: GET Django Version: 1.4.1 Exception Type: error Exception Value: bad group name Exception Location: C:\Python27\lib\re.py in _compile_repl, line 257 Python Executable: C:\Python27\python.exe Python Version: 2.7.3 Python Path: ['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'] Server time: Sun,3 Mar 2013 15:31:05 +0800

Traceback Switch to copy-and-paste view

C:\Python27\lib\site-packages\django\core\handlers\base.py in get_response response = callback(request, *callback_args, **callback_kwargs) ... ▶ Local vars ? D:\ExamPapers\views.py in result newstring += (p.sub(''+word+'', word) + ' ') ... ▶ Local vars

总之,错误出现在:

^{pr2}$

Tags: inpyreforiflib错误callback
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:01

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

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

正则表达式sub方法允许您用另一个字符串替换正则表达式匹配的内容。它还允许您在替换字符串中创建“反向引用”,其中包含匹配的原始字符串的部分。它包含的部分称为“组”,并在原始正则表达式中用方括号表示,在上面的示例中,只有一组方括号,它们是第一组,因此它们由后向引用\1表示。您询问的实际错误消息的原因是替换字符串包含看起来像backref的内容,但正则表达式中没有任何组。在

用它你可以做这样的事情:

keywordMatcher = re.compile(r"\b(keyword|hello)\b")
value = keywordMatcher.sub(r"<b>\1</b>", value)

另一件事与你所问的没有直接关系,但是非常重要的一点是,你正在获取源纯文本字符串(我假设)并将它们变成HTML,这就给了脚本注入漏洞的很多机会,如果你不花时间去理解和避免这些漏洞,就会让坏人入侵应用程序你构建(他们可以用一种自动化的方式来完成,所以即使你认为你的应用程序太小,没人注意到它仍然可能被黑客攻击并被用来做各种坏事,不要让这种情况发生!)。基本规则是,可以将文本转换为HTML,但首先需要“转义”,这非常简单:

^{pr2}$

所有这一切只是将<等字符转换为&lt;,浏览器将显示为<,但不会解释为标记的开头。因此,如果一个坏人在你的表单中输入<script>,并且它被你的代码处理,它将显示为<script>,而不是作为脚本执行。在

同样,如果您在正则表达式中使用了一个文本,而您不打算使用特殊的正则表达式字符,那么您也必须对其进行转义!您可以使用re.escape执行此操作:

import re
my_regexp = re.compile(r"\b%s\b" % (re.escape(my_word),))

好了,现在我们有了一个方法,你可以用它来做你想做的事情:

value = "this is my super duper testing thingy"
keywords = "super|my|test"

from django.utils import html
import re
# first we must split up the keywords
keywords = keywords.split("|")
# Next we must make each keyword safe for use in a regular expression,
# this is similar to the HTML escaping we discussed above but not to
# be confused with it.
keywords = [re.escape(k) for k in keywords]
# Now we reform the keywordTags string, but this time we know each keyword is regexp-safe
keywords = "|".join(keywords)
# Finally we create a regular expression that matches *any* of the keywords
keywordMatcher = re.compile(r'\b(%s)\b' % (keywords,))
# We are going to make the value into HTML (by adding <b> tags) so must first escape it
value = html.escape(value)
# We can then apply the regular expression to the value. We use a "back reference" `\0` to say
# that each keyword found should be replace with itself wrapped in a <b> tag
value = keywordMatcher.sub(r"<b>\1</b>", value)

print value

我劝你花点时间去理解这是怎么回事,否则你只会把自己弄得一团糟!剪切、粘贴并继续前进总是比较容易的,但这会导致糟糕的代码损坏,更糟糕的是,你自己无法改进,也无法学习。所有伟大的程序员都是从初学者开始的,他们花时间去理解事物:)

相关问题 更多 >