我正在开发一个网络服务器访问日志分析工具。有时我会收到命中Web服务器的错误请求。我希望能够识别这些。但是,在尝试测试此字符串“\ x04 \ x01 \x00PÀcö60\ x00”是否以\ x0开头时。 Python报告不匹配。
我在做:
>>> 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 :(得分:2)
输入字符串'\x04\x01\x00P\xC0c\xF660\x00'
的第一个字符是'\x04'
,因为转义序列的格式为\xhh
。
'\\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文档。
答案 1 :(得分:0)
那是因为如果您查看第一个字符,您实际上会看到这一点:
>>> 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
>>>
因此,当您使用值04
对其进行测试时,第一个字符由十六进制值0
表示。
答案 2 :(得分: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()