Python: 十六进制正则表达式问题
我想处理一个叫做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
这样的内容,你的输入就会变得模糊不清。