2017-01-27 12 views
2
from urllib import quote_plus 
import re 
mac = "00:aa:aa:aa:aa:aa" 
path = r"\api\{mac}\test" 
print quote_plus(mac) 
print(re.sub("(.*?)" + "{mac}" + "(.*)", "\\1" + quote_plus(mac)+ "\\2", path)) 

これは私が@%3Aaa%3Aaa%3Aaa%3Aaa%3Aaa\testは後方参照のように見えるエンコードされた文字として扱われている

をレスポンス与え、私はその後、私が期待される応答を取得macaa:aa:aa:aa:aa:aaに変更した場合しかし \api\aa%3Aaa%3Aaa%3Aaa%3Aaa%3Aaa\test

ここで何が起こっているのか任意のアイデアどのようにこれを修正するのですか?

答えて

3

あなたのコードを修正したい場合は、あなたがする必要があるすべては"\\g<1>"(明確な後方参照)で"\\1"を交換です。

置換パターン(連結後)は、最初に\100を含みます。これは実際には@の8進表現です。

Python demoを参照してください。

明確な後方参照についてPython re help参照:定義されているよう\g<name>は、グループの名前名前とマッチしたサブ文字列を使用しますが、上記の文字のエスケープと後方参照に加えて、文字列型REPL引数で

(?P<name>...)構文によって。 \g<number>は、対応するグループ番号を使用します。したがって、\g<2>\2に相当しますが、置換ではあいまいではありません(\g<2>0など)。 \20はグループ2への参照ではなく、グループ20への参照として解釈され、その後にリテラル文字'0'が続きます。後方参照\g<0>は、REと一致する部分文字列全体を置換します。

+0

バックスラッシュと特殊文字の隠された謎。 – MYGz

2

なぜ正規表現を使用していますか?あなたは、文字列置換でそれを行うことができます。

from urllib import quote_plus 

mac = "00:aa:aa:aa:aa:aa" 
mac2 = "aa:aa:aa:aa:aa:aa" 
path = r"\api\{}\test" 
print path.format(quote_plus(mac)) 
print path.format(quote_plus(mac2)) 

出力:

\api\00%3Aaa%3Aaa%3Aaa%3Aaa%3Aaa\test 
\api\aa%3Aaa%3Aaa%3Aaa%3Aaa%3Aaa\test 

変数名でフォーマットしたい場合。

from urllib import quote_plus 

mac = "00:aa:aa:aa:aa:aa" 
mac2 = "aa:aa:aa:aa:aa:aa" 
path = r"\api\{mac}\test" 
print path.format(mac=quote_plus(mac)) 
print path.format(mac=quote_plus(mac2)) 
+0

ありがとう、私はこのアプローチで行くことができると思いますが、これはなぜ問題が発生しているのか答えません。 –

関連する問題