在python中使用startswith或re测试此字符串(“\ x04 \ x01 \x00PÀcö60\ x00”),但返回false

时间:2017-08-24 15:00:26

标签: python string hex

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

3 个答案:

答案 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()