在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'
答
这是因为,如果你想看看第一个字符你会真正看到这一点:
>>> 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()
我感谢您的回答。然而,这让我无法测试这个字符串是否有十六进制文字。这就是我测试\ x0或\ x ...的原因...... – user964491