0

一部のテキストを置き換えるためにPythonのre.sub関数を使用しようとしています。

>>> 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>"
4

2 に答える 2

10

コードに 2 つのバグがあります。まず、一致してキャプチャしていると思われるものを一致させていません(具体的にはキャプチャしていません)-への呼び出しの後に挿入します.search

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

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

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

今、これは賢明に一致し、キャプチャします。第二に、生の文字列リテラル構文を使用すべき場所で使用していないため、バックスラッシュがあると思われる場所にバックスラッシュがありません\1。chr(1) と同じエスケープ シーケンスがあります。生の文字列リテラル構文を使用して修正します。つまり、上記のスニペットの後

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

または、すべてのバックスラッシュを 2 倍にして、エスケープ シーケンスの開始と見なされないようにすることもできますが、生の文字列リテラル構文の方がはるかに読みやすいです。

于 2009-07-30T03:13:55.023 に答える
0
>>> text.replace("><", "<")
'<hi type="italic"> the</hi>'
于 2009-07-30T03:05:21.693 に答える