Django アプリケーションの場合、データベースに一致に関連するリソースがある場合、文字列内のパターンのすべての出現をリンクに変換する必要があります。
現在、プロセスは次のとおりです: - re.sub を使用して非常に長いテキスト文字列を処理します - re.sub がパターン一致を見つけると、そのパターンがデータベース内のエントリと一致するかどうかを調べる関数を実行します - 存在する場合は一致です。リンクをラップします。リンクを一致の周りにラップします。
問題は、データベースに何百ものヒットがある場合があることです。私ができるようにしたいのは、データベースへの単一の一括クエリです。
では、Python で正規表現を使用して一括検索と置換を行うことはできますか?
参考までに、コードは次のとおりです(好奇心のために、私が調べているパターンは法的引用用です):
def add_linked_citations(text):
linked_text = re.sub(r'(?P<volume>[0-9]+[a-zA-Z]{0,3})\s+(?P<reporter>[A-Z][a-zA-Z0-9\.\s]{1,49}?)\s+(?P<page>[0-9]+[a-zA-Z]{0,3}))', create_citation_link, text)
return linked_text
def create_citation_link(match_object):
volume = None
reporter = None
page = None
if match_object.group("volume") not in [None, '']:
volume = match_object.group("volume")
if match_object.group("reporter") not in [None, '']:
reporter = match_object.group("reporter")
if match_object.group("page") not in [None, '']:
page = match_object.group("page")
if volume and reporter and page: # These should all be here...
# !!! Here's where I keep hitting the database
citations = Citation.objects.filter(volume=volume, reporter=reporter, page=page)
if citations.exists():
citation = citations[0]
document = citation.document
url = document.url()
return '<a href="%s">%s %s %s</a>' % (url, volume, reporter, page)
else:
return '%s %s %s' % (volume, reporter, page)