Python: 十六进制正则表达式问题

3 投票
6 回答
7687 浏览
提问于 2025-04-16 02:14

我想处理一个叫做Docklight的串口监控程序的输出(我强烈推荐这个程序)。它输出的是“十六进制”字符串,也就是一串由两个大写的十六进制数字和一个空格组成的序列。对应的正则表达式是:([0-9A-F]{2} )+,例如:'05 03 DA 4B 3F '

当程序检测到特定的字符序列时,它会在这个“十六进制”字符串中添加注释。例如:

'05 03 04 01 0A  The Header 03 08 0B BD AF  The PAYLOAD 0D 0A  The Footer'

这些注释的格式是' .+ '(就是一个字符序列,前面和后面都有空格)

我想去掉这些注释。比如,上面那个“十六进制”字符串经过过滤后应该是:

'05 03 04 01 0A 03 08 0B BD AF 0D 0A '

我该如何用正则表达式来实现这个呢?

6 个回答

0

那我们来看看一个实际上使用了正则表达式否定的解决方案吧?;)

result = re.sub(r"[ ]+(?:(?!\b[0-9A-F]{2}\b).)+", "", subject)
0

虽然你已经得到了两个答案,可以找到所有的十六进制数字,但这里有一个直接的正则表达式,可以帮你找到所有看起来不像十六进制数字的文本(假设十六进制数字是两个字母或数字,范围是大写或小写的0-9和A-F,后面跟着一个空格)。

大概是这样的(抱歉,我不是Python高手,但你明白我的意思):

newstring = re.sub(r"[^ ]+(?<![0-9A-Fa-f ]{2}|^.)", "", yourstring)

这个方法是通过“回看”来工作的。它会找到每个连续的非空子串,然后用(?<!....)进行负向回看。它的意思是:“如果前面的两个字符不是十六进制数字,那就成功匹配。”最后的^.是为了防止错误地匹配到字符串的第一个字符。

编辑

根据Alan Moore的建议,这里有一个使用正向预查表达式的相同思路:

newstring = re.sub(r"(?>\b[0-9A-Fa-f ]{2}\b)", "", yourstring)
4

你可以试试 re.findall() 这个方法:

>>> a='05 03 04 01 0A  The Header 03 08 0B BD AF  The PAYLOAD 0D 0A  The Footer'
>>> re.findall(r"\b[0-9A-F]{2}\b", a)
['05', '03', '04', '01', '0A', '03', '08', '0B', 'BD', 'AF', '0D', '0A']

在这个正则表达式中,\b 是用来匹配“单词边界”的。

当然,如果串口监视器插入了像 THIS BE THE HEADER 这样的内容,你的输入就会变得模糊不清。

撰写回答