我在“坏组名”上遇到了一个错误。在
代码如下:
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}$
所以你要用粗体突出显示一组关键字的出现。现在这个代码在很多方面被破坏了。您现在正在使用
re
模块来匹配关键字,但是您也将关键字和字符串分解为单独的单词,您不需要同时进行这两种操作,解决问题的两种不同方法之间的交互作用是导致问题的原因。在你可以使用正则表达式同时匹配多个可能的字符串,这就是它们的优点!因此,您可以使用
"^keyword$"
来匹配“keyword”,而不是使用"^keyword|hello$"
来匹配“keyword”或“hello”。您还可以使用^
和$
字符,它们只匹配整个字符串的开头或结尾,但您最初可能希望匹配单词的开头或结尾,为此,您可以使用\b
,就像这样r"\b(keyword|hello)\b"
。请注意,在上一个示例中,我在字符串前面添加了一个r
字符,这表示“raw”,并关闭pythons通常处理与正则表达式冲突的反斜杠字符,当字符串包含正则表达式时,最好在字符串前使用r
。我还用括号把这些词组合在一起。在正则表达式
sub
方法允许您用另一个字符串替换正则表达式匹配的内容。它还允许您在替换字符串中创建“反向引用”,其中包含匹配的原始字符串的部分。它包含的部分称为“组”,并在原始正则表达式中用方括号表示,在上面的示例中,只有一组方括号,它们是第一组,因此它们由后向引用\1
表示。您询问的实际错误消息的原因是替换字符串包含看起来像backref的内容,但正则表达式中没有任何组。在用它你可以做这样的事情:
另一件事与你所问的没有直接关系,但是非常重要的一点是,你正在获取源纯文本字符串(我假设)并将它们变成HTML,这就给了脚本注入漏洞的很多机会,如果你不花时间去理解和避免这些漏洞,就会让坏人入侵应用程序你构建(他们可以用一种自动化的方式来完成,所以即使你认为你的应用程序太小,没人注意到它仍然可能被黑客攻击并被用来做各种坏事,不要让这种情况发生!)。基本规则是,可以将文本转换为HTML,但首先需要“转义”,这非常简单:
^{pr2}$所有这一切只是将
<
等字符转换为<
,浏览器将显示为<
,但不会解释为标记的开头。因此,如果一个坏人在你的表单中输入<script>
,并且它被你的代码处理,它将显示为<script>
,而不是作为脚本执行。在同样,如果您在正则表达式中使用了一个文本,而您不打算使用特殊的正则表达式字符,那么您也必须对其进行转义!您可以使用
re.escape
执行此操作:好了,现在我们有了一个方法,你可以用它来做你想做的事情:
我劝你花点时间去理解这是怎么回事,否则你只会把自己弄得一团糟!剪切、粘贴并继续前进总是比较容易的,但这会导致糟糕的代码损坏,更糟糕的是,你自己无法改进,也无法学习。所有伟大的程序员都是从初学者开始的,他们花时间去理解事物:)
相关问题 更多 >
编程相关推荐