2012-03-23 3 views
1

Pythonでre.subを使用して文字列 "( - )"を置き換えることができません。re.sub "( - )"が失敗しました

>>> instr = 'Hello, this is my instring' 
>>> re.sub('my', 'your', instr) 
'Hello, this is your instring' 
>>> instr = 'Hello, this is my (-) instring' 
>>> re.sub('my (-)', 'your', instr) 
'Hello, this is my (-) instring' 

私が間違っていることを誰かに教えてください。

ありがとうございました!

+1

わからない(#は私が追加された後のものは、それはデバッグ出力からではないのです)、しかし、多分あなたは括弧をエスケープする必要があります彼らはグループの指標として解釈されませんか? '\( - \)' – phimuemue

答えて

6
re.sub(r'my \(-\)', 'your', instr) 

通常、一致するグループに使用される括弧をエスケープする必要があります。また、文字列の前にrを追加して、バックスラッシュのために生のままにしておきます。

それとも(自分の置換が簡単なことであれば)すべてで正規表現を使用していないと、あなたは多くの問題を気にする必要はありません。

>>> instr = 'Hello, this is my (-) instring' 
>>> instr.replace('my (-)', 'your') 
'Hello, this is your instring' 
+0

ありがとうユーミロ。あなたは私の一日を救った。 – Tim

3

それが規則的であるので、あなたは'(-)'をエスケープする必要があります正規表現エンジンに関する限り、正規表現パターンの一致。あなたは脱出する方法についてわからない場合は、しかし、あなたの文字列が実際のパターンを持っていませんが、逐語的に解釈されるべきであり、あなたが実行する必要があります。

>>> re.sub(re.escape('my (-)'), 'your', instr) 
'Hello, this is your instring' 

たり、文字列は「プレーン」とのミックスであるかをパターンと複雑なもの、あなたがこれを行うことができます:

>>> re.sub('[a-z]{2} %s' % re.escape('(-)'), 'your', instr) 
'Hello, this is your instring' 
2

を、このようなデバッグ物事への一つの方法は、re.DEBUG flagを使用することです:

>>> import re 

>>> p = re.compile("my (-)", re.DEBUG) 
literal 109 # chr(109) == "m" 
literal 121 # chr(121) == "y" 
literal 32 # chr(32) == " " 
subpattern 1 # a group 
    literal 45 # chr(45) == "-" 
<_sre.SRE_Pattern object at 0x1004348a0> 

だから、これは一致した「 - 」グループで、ノーどこ私リテラル(のtマッチは、に比べ:そう、

>>> re.compile(r"my \(-\)", re.DEBUG) 
literal 109 
literal 121 
literal 32 
literal 40 # chr(40) == "(", not a group this time 
literal 45 
literal 41 
<_sre.SRE_Pattern object at 0x10043ea48> 

関連する問題