Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于字节数数据的Python regexp_Python_Regex - Fatal编程技术网

用于字节数数据的Python regexp

用于字节数数据的Python regexp,python,regex,Python,Regex,如何使regexp与一行字节匹配? 例如,如何使用regexp检查二进制数据是否由(0-10字节)字符组成 data=0x00 0x05 0x02 0x00 0x03。。。(不是字符串,二进制数据)这将匹配空格前的任何代码: 我不确定您所说的“0-10字节”是什么意思,但如果您的意思是只想匹配字节值0到10,那么请将上述代码中的\037替换为\012 请注意,0-10并不是表示二进制数据的唯一代码;任何低于\040或高于\0177的内容通常建议使用二进制数据。如果要检查字符串是否只包含chr(0

如何使regexp与一行字节匹配?
例如,如何使用regexp检查二进制数据是否由(0-10字节)字符组成


data=0x00 0x05 0x02 0x00 0x03
。。。(不是字符串,二进制数据)

这将匹配空格前的任何代码:

我不确定您所说的“0-10字节”是什么意思,但如果您的意思是只想匹配字节值0到10,那么请将上述代码中的
\037
替换为
\012


请注意,0-10并不是表示二进制数据的唯一代码;任何低于
\040
或高于
\0177
的内容通常建议使用二进制数据。

如果要检查字符串是否只包含
chr(0)
chr(10)
之间的字符,只需使用

re.match('^[\0-\x0A]*$',data)
对于Python3,您可以对字节字符串执行相同的操作:

re.match(b'^[\0-\x0A]*$',b'\x01\x02\x03\x04')
如果要检查给定字符串中的所有字符是否在
0x00
0x0B
(不包括在内)的范围内,则regex的杀伤力太大了。试着这样做:

>>> check_range = lambda x: ord(x) in set(range(0x00, 0x0B))
>>> s = '\x1\x2\x3\xA'
>>> s2 = 'abcde'

>>> print all(check_range(c) for c in s)
True
>>> print all(check_range(c) for c in s2)
False
>>>

我知道,我只是在想是否可以用regexp完成。在python文档中没有找到这样的信息。@mac:python字符串本质上是字节数组,它们可以包含二进制数据,正则表达式可以很好地匹配这些数据。您可以发布一些数据的python
repr
(例如,
print repr(data[:50])
)吗?不清楚字符串中是否有二进制数据或这种数据的十六进制表示形式。我使用timeit模块、短字符串s(5个符号)、百万次执行对其进行了测试。我自己的测试证明了这一点。我想删除这个答案,但你的评论是有用的。通过一些优化,我成功地将其速度降低到regex版本的1.3倍左右,但不低于它。
>>> check_range = lambda x: ord(x) in set(range(0x00, 0x0B))
>>> s = '\x1\x2\x3\xA'
>>> s2 = 'abcde'

>>> print all(check_range(c) for c in s)
True
>>> print all(check_range(c) for c in s2)
False
>>>