Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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:十六进制正则表达式问题_Python_Regex_Regex Negation - Fatal编程技术网

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

Python:十六进制正则表达式问题,python,regex,regex-negation,Python,Regex,Regex Negation,我想解析一个名为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' 注释是以下格式的字符串:。+”(前面是空格

我想解析一个名为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 '
如何使用正则表达式执行此操作?

您可以尝试:

正则表达式中的
\b
与“单词边界”匹配


当然,如果串行监视器插入类似于
这是标题的内容,则您的输入是不明确的。如果插入的字符串不包含匹配项,则查找所有十六进制数可能会更容易:

>>> 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'
这将使用前瞻性来计算插入的字符串何时结束。它查找由空格包围的十六进制字符串或源字符串的结尾。

使用正则表达式

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

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

类似这样的事情(对不起,我不是蟒蛇爱好者,但你知道了):


为什么是regexp?对我来说,更多的pythonic是(固定为六位数而非常规位数):


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


@SRT:假设注释中没有2个更好的十六进制单词,否则输入将是不明确的。但是,注释可以包含更长的单词(连续的)十六进制数字OK。请看greg的回答。请注意:我通常用来测试正则表达式的是这个免费的在线测试工具,它也适用于Python表达式(Python和.net表达式的大部分是相同的风格):您如何推荐一个没有易于解析的输出选项的软件包?@JM:我推荐它,因为它是我发现的唯一一个可以在Windows PC上成功处理killer load串行通信的工具。如果注释(用户定义)遵循特定语法(例如,用方括号括起来)那么解析就是蛋糕了。这不是我的客户的情况太好了!小测验:你的正则表达式否定还是我的否定表情更难看?lolIt太接近了,打电话太近了,但是如果你在你的电话里加上单词边界(我认为你应该这样做),你将是明显的赢家。或者我应该说是不清楚的赢家吗?;)您的愿望是我的命令,我已将它们添加到前瞻版本;)在这类事情上使用lookaheads通常更容易(而且可能更有效)。@Alan,确实可能是这样,但是你会更快地得到误报。在本例中,使用单词boundary,它可以工作。我更新了答案。
hexa = '([0-9A-F]{2} )+'
" ".join(re.findall(hexa, line))
newstring = re.sub(r"[^ ]+(?<![0-9A-Fa-f ]{2}|^.)", "", yourstring)
newstring = re.sub(r"(?>\b[0-9A-Fa-f ]{2}\b)", "", yourstring)
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))
result = re.sub(r"[ ]+(?:(?!\b[0-9A-F]{2}\b).)+", "", subject)