3

我想解析一个名为 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 '

我该如何使用正则表达式来做到这一点?

4

6 回答 6

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.

于 2010-08-03T10:36:17.140 回答
0

使用你的正则表达式

hexa = '([0-9A-F]{2} )+'
" ".join(re.findall(hexa, line))
于 2010-08-03T10:46:25.770 回答
0

虽然您已经收到了两个找到所有十六进制数字的答案,但直接正则表达式也是如此,它可以找到所有看起来不像十六进制数字的文本(假设是大写/小写 0-9 和 AF 中的两个字母/数字范围,后跟一个空格)。

像这样的东西(对不起,我不是 pythoneer,但你明白了):

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

它通过“回头看”来工作。它找到每个连续的非空间子字符串,然后用(?<!....). 它说:“如果前两个字符不是十六进制数字,则成功”。^.末尾的 little可以防止错误地匹配字符串的第一个字符。

编辑

正如 Alan Moore 所建议的,这里有一个带有积极前瞻表达式的相同想法:

newstring = re.sub(r"(?>\b[0-9A-Fa-f ]{2}\b)", "", yourstring)
于 2010-08-03T10:47:35.317 回答
0

为什么是正则表达式?对我来说更多的 Pythonic 是(固定为 hexdigit 不是常规数字):

command='05 03 04 01 0A  The Header 03 08 0B BD AF  The PAYLOAD 0D 0A  The Footer'
print ' '.join(com for com in command.split()
               if len(com)==2 and all(c.upper() in '0123456789ABCDEF' for c in com))
于 2010-08-03T10:53:38.173 回答
0

实际使用正则表达式否定的解决方案怎么样?;)

result = re.sub(r"[ ]+(?:(?!\b[0-9A-F]{2}\b).)+", "", subject)
于 2010-08-03T10:53:58.967 回答
0

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

>>> 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'

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

于 2010-08-03T10:37:55.303 回答