在 Python 中测试这个字符串( "x04x01x00PÀcö60x00" ) 以 WITH 或 re 开头,但返回 false



我正在开发一个网络服务器访问日志分析工具。有时我会收到访问 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()

最新更新