つまり、一連のキーワードの出現を太字で強調しようとしています。現在、このコードは非常に多くの方法で壊れています。現在、モジュールを使用しre
てキーワードを照合していますが、キーワードと文字列を個々の単語に分割しているため、両方を実行する必要はありません。問題を解決するためのこれら2つの異なるアプローチ間の相互作用は次のとおりです。問題の原因は何ですか。
正規表現を使用して、複数の可能な文字列を同時に一致させることができます。これは、それらが適していることです。したがって、「キーワード」だけに一致させる代わりに、「キーワード」または「こんにちは」のいずれかに一致させるために"^keyword$"
使用できます。また、文字列全体の最初または最後にのみ一致するand文字を使用しますが、おそらく元々必要だったのは、単語の最初または最後に一致することでした。このため、このように使用できます。最後の例では、文字列の前に文字を追加しました。これは「raw」を表し、正規表現と競合するバックスラッシュ文字のpythonsの通常の処理をオフにします。常に使用することをお勧めします。"^keyword|hello$"
^
$
\b
r"\b(keyword|hello)\b"
r
r
文字列に正規表現が含まれている場合は、文字列の前。また、角かっこを使用して単語をグループ化しました。
正規表現sub
メソッドを使用すると、正規表現に一致するものを別の文字列に置き換えることができます。また、一致した元の文字列の一部を含む置換文字列で「逆参照」を行うこともできます。これに含まれる部分は「グループ」と呼ばれ、元の正規表現では角かっこで示されます。上記の例では、角かっこは1セットしかなく、これらが最初であるため、後方参照で示されます\1
。質問した実際のエラーメッセージの原因は、置換文字列にbackrefのように見えるものが含まれていましたが、正規表現にグループがなかったことです。
それを使用して、次のようなことを行います。
keywordMatcher = re.compile(r"\b(keyword|hello)\b")
value = keywordMatcher.sub(r"<b>\1</b>", value)
あなたが求めているものとは直接関係がないが、非常に重要なもう1つのことは、ソースのプレーンテキスト文字列(私が推測する)を取得してHTMLに変換することです。これにより、スクリプトインジェクションの脆弱性が発生する可能性が高くなります。時間をかけて理解して回避すると、悪意のあるユーザーが作成したアプリケーションをハッキングする可能性があります(これは自動化された方法で実行できるため、アプリが小さすぎて誰にも気付かないと思われる場合でも、ハッキングされる可能性があります)あらゆる種類の悪いことに使用されますが、これを起こさせないでください!)。基本的なルールは、テキストをHTMLに変換しても問題ないということですが、最初にテキストを「エスケープ」する必要があります。これは非常に簡単です。
from django.utils import html
html_safe = html.escape(my_text)
これは、ブラウザが表示する文字を変換する<
だけですが、タグの先頭としては解釈されません。したがって、悪意のあるユーザーがフォームの1つに入力し、それがコードによって処理されると、スクリプトとしては実行されず、として表示されます。<
<
<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
時間をかけてこれが何をするのかを理解することをお勧めします。そうしないと、混乱してしまいます。カットアンドペーストして先に進む方が常に簡単ですが、これはコードの破損につながり、さらに悪いことに、自分自身が改善せず、学習しないことを意味します。すべての優れたコーダーは、時間をかけて理解する初心者コーダーとして始まりました:)