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

2024-05-18 20:36:28 发布

您现在位置: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 '

如何使用正则表达式执行此操作?


Tags: the字符串程序序列数字字符bdda
3条回答

你可以试试^{}

>>> 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的内容,则您的输入是不明确的。

使用正则表达式

hexa = '([0-9A-F]{2} )+'
" ".join(re.findall(hexa, line))

如果插入的字符串不包含匹配项,则查找所有十六进制数可能更容易:

>>> data = '05 03 04 01 0A  The Header 03 08 0B BD AF  The PAYLOAD 0D 0A  The Footer'
>>> import re
>>> pattern = re.compile("[0-9A-F]{2} ")
>>> "".join(pattern.findall(data))
'05 03 04 01 0A 03 08 0B BD AF AD 0D 0A '

否则,可以使用插入的字符串前面有两个空格的事实:

>>> data = '05 03 04 01 0A  The Header 03 08 0B BD AF  The PAYLOAD 0D 0A  The Footer'
>>> re.sub("(  .*?)(?=( [0-9A-F]{2} |$))","",data)
'05 03 04 01 0A 03 08 0B BD AF 0D 0A'

这将使用“向前看”来计算插入的字符串何时结束。它查找由空格包围的十六进制字符串或源字符串的结尾。

相关问题 更多 >

    热门问题