5

Webページ(djangoで作成)内のすべてのWikiLinkタイプの文字列をhtmlリンクに変換しようとしています。

次の式を使用しています

import re
expr = r'\s+[A-Z][a-z]+[A-Z][a-z]+\s'
repl=r'<a href="/photos/\1">\1</a>'
mystr = 'this is a string to Test whether WikiLink will work ProPerly'

parser=re.compile(expr)
parser.sub(repl, mystr)

これにより、文字列が16進値に置き換えられた次の文字列が返されます。

"this is a string to Test whether<a href='/mywiki/\x01>\x01</a>'will work<a href='/mywiki/\x01>\x01</a>'"

re.subのPythonヘルプを見て、\1を\g <1>に変更しようとしましたが、無効なグループ参照エラーが発生します。

これを機能させる方法を理解するのを手伝ってください

4

1 に答える 1

21

ここでの問題は、にキャプチャされたグループがないことですexpr

一致のどの部分を表示したい場合でも\1、括弧を入れる必要があります。例えば:

>>> expr = r'\s+([A-Z][a-z]+[A-Z][a-z]+)\s'
>>> parser=re.compile(expr)
>>> parser.sub(repl, mystr)
'this is a string to Test whether<a href="/photos/WikiLink">WikiLink</a>will work ProPerly'

後方\1参照は、一致内のグループ1を参照します。これは、最初の括弧で囲まれた部分式に一致した部分です。同様に、\2グループ2は、2番目の括弧で囲まれた部分式に一致した部分です。\1グループが1つ未満の場合に使用すると、一部の正規表現エンジンでエラーが発生し、その他のエンジンではリテラル'\1'文字であるctrl-Aが使用されます。Pythonは後者を実行し、ctrl-Aの正規表現は'\x01'であるため、そのように表示されます。

グループ0は完全一致です。しかし、この場合、スペースを置換の一部にしたくないので、それはあなたが望むものではありません。

構文が必要な唯一の理由gは、単純な後方参照があいまいな場合です。たとえば、subがだった場合、それが、、グループ1、グループ1、グループ1456のいずれであるか、または…</p> 123\1456を意味するかどうかを判断する方法はありません。123456123

グループ化と後方参照についてさらに読む。

于 2012-11-29T23:34:00.387 に答える