2017-08-24 5 views
-1

私はWebサーバーのアクセスログ分析ツールで作業しています。時には、私は、Webサーバーに不正なリクエストを送ることがあります。私はこれらを特定できるようにしたい。しかし、この文字列 "\ x04 \ x01 \x00PÀcö60\ x00"が\ ​​x0で始まるかどうかをテストしようとするとき。 Pythonはマッチを報告しません。pythonでこの文字列( " x04 x01 x00PÀcö60 x00")をstartswithまたはreで返しますが、偽を返します

私がやっている:私はここで何をしないのです

>>> t = "\x04\x01\x00P\xC0c\xF660\x00" 
>>> t.startswith('\\x0') 
False 

?私は正規表現も試しましたが、サイコロはありませんでした。 :(

私もスラッシュを取り除くしようとしましたが、私はできません。どのような魔法このですか?

>>> t.replace("\\", "") 
'\x04\x01\x00PÀcö60\x00' 
>>> t 
'\x04\x01\x00PÀcö60\x00' 
+0

あなたの答えに感謝します。しかし、これは、この文字列に16進数のリテラルが含まれているかどうかを調べるという難点があります。それが\ x0または\ xをテストしていた理由です... – user964491

答えて

0

:あなたは0の値でそれをテストしながら、だから、最初の文字が04の進値で表され

>>> t = "\x04\x01\x00P\xC0c\xF660\x00" 
>>> t 
'\x04\x01\x00P\xc0c\xf660\x00' 
>>> t[0] 
'\x04' 
>>> t.startswith('\\x0') 
False 
>>> t.startswith('\\x04') 
False 
>>> t.startswith('\x04') 
True 
>>> 

2

エスケープシーケンスがフォーマット\xhhを持っているように、入力文字列'\x04\x01\x00P\xC0c\xF660\x00'の最初の文字が'\x04'です。

あなたの例では

'\\x0'は、実際には3つの文字で構成される文字列です。'\''x''0'比較:

>>> len('\x04') 
1 
>>> len('\\x0') 
3 

ので、正しいチェックがt.startswith('\x04')次のようになります。

>>> t = '\x04\x01\x00P\xC0c\xF660\x00' 
>>> t.startswith('\x04') 
True 

は、より多くの詳細についてはLiteralsマニュアルを参照してください。あなたが最初の文字を見たい場合は、実際にこれを参照してくださいねのでです

0

あなたは\\で文字列を分割するために、リストの内包表記を使用することができます。

t = "\x04\x01\x00P\xC0c\xF660\x00" 
t = [i for i in t if i != "\\"] 

tが含まれています

['\x04', '\x01', '\x00', 'P', '\xc0', 'c', '\xf6', '6', '0', '\x00'] 

最初の文字にアクセスするには、ある進文字を提供する必要があります0ではなく、04

if t[0] == "\x04": 
    do_something()