0

リストから指定された文字列に「a」タグを挿入するためのdjangoフィルターを作成しています。

これは私がこれまでに持っているものです:

def tag_me(text):
    tags = ['abc', 'def', ...]
    tag_join = "|".join(tags)
    regex = re.compile(r'(?=(.))(?:'+ tag_join + ')', flags=re.IGNORECASE)
    return regex.sub(r'<a href="/tag/\1/">\1</a>', text)

例:

tag_me('some text def')

戻り値:

'some text <a href="/tag/d/">d</a>'

期待される:

'some text <a href="/tag/def/">def</a>'

問題は、一致するregex.subにありますが、最初の文字のみを返します。最後の行の\1をキャプチャ/使用する方法に問題がありますか?

4

4 に答える 4

3

質問のシーケンス(?: ...)は、特にキャプチャをオフにすることに注意してください。re(強調を追加して)次のようなドキュメント(約1/5からページ)を参照してください。

(?:...) 通常の括弧の非キャプチャバージョン。括弧内の正規表現に一致しますが、グループによって一致した部分文字列は、一致を実行した後、またはパターンの後半で参照された後は取得できません。

前の回答で述べたように、動作するか、ターゲットテキストでエスケープが使用されている場合は'('+ tag_join + ')'推奨バージョンを使用します。"|".join(re.escape(tag) for tag in tags)

于 2013-03-08T18:47:44.963 に答える
2

(.)たった1人のキャラクターであるパー​​ツをキャプチャしています。

私はあなたの正規表現に従うかどうかわかりません-簡略化されたバージョンr'('+ tag_join + ')'はあなたの例でうまく機能します。

タグ名に英数字以外の文字が含まれている可能性がある場合は、次のようにする必要があることに注意してください。

tag_join = "|".join(re.escape(tag) for tag in tags)
于 2013-03-08T18:18:30.937 に答える
2

単に行う

import re

def tag_me(text):
    tags = ['abc', 'def']
    reg = re.compile("|".join(tags).join('()'),
                       flags=re.IGNORECASE)
    return reg.sub(r'<a href="/tag/\1/">\1</a>', text)

print '            %s' % tag_me('some text def')
print 'wanted:     some text <a href="/tag/def/">def</a>'

これは、キャプチャされていないグループを作成するため、この邪魔なものを前面に(?:....)配置する必要があるためです。(?=(.))

于 2013-03-08T18:41:33.263 に答える
1

これはそれを行う必要があります

def tag_me(text):
    tags = ['abc', 'def', ]
    tag_join = "|".join(tags)
    pattern = r'('+tag_join+')'
    regex = re.compile(pattern, flags=re.IGNORECASE)
    return regex.sub(r'<a href="/tag/\1/">\1</a>', text)
于 2013-03-08T18:47:25.960 に答える