我正在开发一个网络服务器访问日志分析工具。有时我会收到访问 Web 服务器的格式错误的请求。我希望能够识别这些。但是,当尝试测试此字符串"\x04\x01\x00PÀcö60\x00"是否以 \x0 开头时。Python 报告没有匹配项。
我正在做:
>>> t = "x04x01x00PxC0cxF660x00"
>>> t.startswith('\x0')
False
我在这里错过了什么?我也尝试了正则表达式,但没有骰子。:(
我什至试图剥离斜杠,但我不能。这是什么魔法?
>>> t.replace("\", "")
'x04x01x00PÀcö60x00'
>>> t
'x04x01x00PÀcö60x00'
输入字符串'x04x01x00PxC0cxF660x00'
的第一个字符'x04'
,因为转义序列的格式为xhh
。
您的示例中'\x0'
实际上是一个由 3 个字符组成的字符串:''
、'x'
和'0'
。比较:
>>> len('x04')
1
>>> len('\x0')
3
所以正确的检查是t.startswith('x04')
:
>>> t = 'x04x01x00PxC0cxF660x00'
>>> t.startswith('x04')
True
有关更多详细信息,请参阅文本文档。
这是因为如果你看第一个字符,你实际上会看到这个:
>>> t = "x04x01x00PxC0cxF660x00"
>>> t
'x04x01x00Pxc0cxf660x00'
>>> t[0]
'x04'
>>> t.startswith('\x0')
False
>>> t.startswith('\x04')
False
>>> t.startswith('x04')
True
>>>
因此,第一个字符由十六进制值04
表示,而您用值0
对其进行了测试。
您可以使用列表推导式将字符串分解为\
:
t = "x04x01x00PxC0cxF660x00"
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()