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

问题描述:

我正在使用Web服务器访问日志分析工具。有时候我会收到格式错误的请求,触发Web服务器。我希望能够识别这些。但是,当试图测试此字符串“\ x04 \ x01 \x00PÀc60\ x00”是否以\ x0开头时。 Python报告不匹配。在Python中使用startswith或re测试此字符串(“ x04 x01 x00PÀcö60 x00”),但返回false

我做:

>>> 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

我感谢您的回答。然而,这让我无法测试这个字符串是否有十六进制文字。这就是我测试\ x0或\ x ...的原因...... – user964491

这是因为,如果你想看看第一个字符你会真正看到这一点:

>>> 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值测试,它代表。

输入字符串'\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文档了解更多信息。

您可以使用列表解析由\\打破串了起来:

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