2

私はPythonの文字列に単純な正規表現を置き換えようとしています。これは私のコードです:

>>> s = "num1 1 num2 5"
>>> re.sub("num1 (.*?) num2 (.*?)","1 \1 2 \2",s)

\numbersが対応するグループに置き換えられた、このような出力を期待します。

'1 1 2 5'

しかし、これは私が得ている出力です:

'1 \x01 2 \x025'

そして、私はなぜ\x0sが彼らのものであり、私がそこにいたいのかではないのかについてちょっと困惑しています。助けてくれてありがとう

4

3 に答える 3

7

生の文字列の使用を開始する必要があります(文字列の前にrを付けます)。

>>> import re
>>> s = "num1 1 num2 5"
>>> re.sub(r"num1 (.*?) num2 (.*?)", r"1 \1 2 \2", s)
'1 1 2 5'

それ以外の場合は、次のように、Pythonと正規表現の両方でバックスラッシュをエスケープする必要があります。

>>> re.sub("num1 (.*?) num2 (.*?)", "1 \\1 2 \\2", s)
'1 1 2 5'

(これは本当に速く古くなります、python正規表現ドキュメントの冒頭の段落をチェックしてください

于 2012-05-18T17:47:33.390 に答える
1

\1正規表現エンジンに\2渡されるだけでなく、8進数の文字コードエスケープとして解釈されます。r"\1"代わりに生の文字列を使用すると"\1"、この解釈が妨げられます。

>>> "\17"
'\x0f'
>>> r"\17"
'\\17'
于 2012-05-18T17:48:58.367 に答える
1

\1文字列で解釈されています。\したがって、独自のバックスラッシュでをエスケープする必要があります。

>>> re.sub("num1 (.*?) num2 (.*?)", "1 \\1 2 \\2",s)
'1 1 2 5'

生の文字列を使用することもできます。

>>> re.sub("num1 (.*?) num2 (.*?)", r"1 \1 2 \2",s)
'1 1 2 5'
于 2012-05-18T17:50:42.713 に答える