0

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

这是代码:

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 异常类型:错误异常值:错误组名异常位置:C:\Python27\lib\re.py in _compile_repl,第 257 行 Python 可执行文件: C:\Python27\python.exe Python 版本: 2.7.3 Python 路径: ['D:\ExampPapers', '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'] 服务器时间:Sun,3 Mar 2013 15:31:05 +0800

Traceback 切换到复制和粘贴视图

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

总之,错误在于:

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

1 回答 1

1

因此,您尝试以粗体突出显示一组关键字的出现。现在这段代码在很多方面都被破坏了。您现在正在使用该re模块来匹配关键字,但您也将关键字和字符串分解为单个单词,您不需要两者都做,这两种解决问题的不同方法之间的交互是是什么导致了你的问题。

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

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

使用它,您可以执行以下操作:

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

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

from django.utils import html
html_safe = html.escape(my_text)

所有这一切都是将字符转换<&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

我敦促您花时间了解它的作用,否则您只会把自己弄得一团糟!只是剪切和粘贴并继续前进总是更容易,但这会导致糟糕的损坏代码,更糟糕的是意味着你自己没有改进也没有学习。所有伟大的程序员都是从初学者开始的,他们花时间去理解事物:)

于 2013-03-03T08:26:43.973 回答