2009-07-30 24 views
1

私はPythonのre.sub関数を使用してテキストを置き換えようとしています。その後Python: number逆参照で

>>> import re 
>>> text = "<hi type=\"italic\"> the></hi>" 
>>> pat_error = re.compile(">(\s*\w*)*>") 
>>> pat_error.search(text) 
<_sre.SRE_Match object at 0xb7a3fea0> 
>>> re.sub(pat_error, ">\1", text) 
'<hi type="italic">\x01</hi>' 

テキストの値は、あなたのコード内の

"<hi type="italic"> the</hi>" 
+0

これは本当に問題ではありません... –

答えて

9

2つのバグでなければなりません。まず、あなたはあなたが一致してキャプチャしていると思うものを(キャプチャし、具体的かつ)、一致していない - .searchにあなたの呼び出しの後に挿入します。

>>> _.groups() 
('',) 

繰り返しの制約のない繰り返し(キャプチャグループと後の星星だけでなく)は一度あまりにも多くマッチしていると思うものの最後に空の文字列とマッチします。それがキャプチャされます。例えば、プラスに星のうち少なくとも一つを変更することで修正:

>>> pat_error = re.compile(r">(\s*\w+)*>") 
>>> pat_error.search(text) 
<_sre.SRE_Match object at 0x83ba0> 
>>> _.groups() 
(' the',) 

さて、これは一致し、賢明にキャプチャします。第2に、生の文字列リテラル構文を使用していないので、あなたが持っていると思われるバックスラッシュはありません。つまり、chr(1)と同じエスケープシーケンス\1があります。それらをエスケープシーケンスの開始と解釈されるのを避けるために、すなわち

>>> pat_error.sub(r">\1", text) 
'<hi type="italic"> the</hi>' 

はまた、あなたのバックスラッシュのすべてを倍増でした上記のスニペットの後に、生の文字列リテラル構文を使用して修正 - しかし、生の文字列リテラルの構文は次のとおりです。はるかに読みやすい。

0
>>> text.replace("><", "<") 
'<hi type="italic"> the</hi>' 
+0

テキストの値が「 stuff blah」の場合があるため、これは機能しません。 – Daniel

関連する問題