python中十六进制字符串的正则表达式不起作用

Posted

技术标签:

【中文标题】python中十六进制字符串的正则表达式不起作用【英文标题】:Regular expression for hexadecimal string in python not working 【发布时间】:2012-05-03 11:11:24 【问题描述】:

我有一个正则表达式来匹配字符串,例如:

--D2CBA65440D

--77094A27E09

--77094A27E

--770

--77094A27E09--

基本上,它匹配一个由一个或多个换行符或空格包围的十六进制字符串,并具有前缀 -- 可能有也可能没有 -- 作为后缀

我使用以下 python 代码,大部分时间都可以正常工作:

hexaPattern = "\s--[0-9a-fA-F]+[--]?\s"
hex = re.search(hexaPattern, part)
if hex:
   print "found a match"

这适用于上述所有情况,但与此块中的 --77094A27E09 不匹配:

<div id="arrow2" class="headerLinksImg" style="display:block

--77094A27E09

;">

但匹配相同的字符串:

<input type="checkbox" name="checkbox" id="checkboxKG3" class

--77094A27E09

Content-T="checkboxKG" value="KG3" />

我做错了什么?

【问题讨论】:

尝试修剪两边的 html,直到找到导致问题的字符 我得到了该块的匹配项:rubular.com/r/wfqgEPHObB 请注意,[--]? 将匹配一个或不匹配一个破折号,不是两个破折号。我想你的意思是(--)? 我的意思是两个破折号......但[--]? 工作 【参考方案1】:

其他人指出您的正则表达式存在问题,即[--],它基本上以非常规的方式找到一个连字符......无论如何,这都不是您想要的。

我还建议在正则表达式的开头和结尾同时使用\s 在某些情况下也会导致问题,因为它匹配spacestabsnewlines。因此,您最终可能会遇到这样一种情况:您的文件有 --77094A27E09\n--D2CBA65440D,而第二个 --D2CBA65440D 将不匹配,因为在上一场比赛结束时,\s 使用了换行符。

此外,您似乎正在单独检查文件中的每一行,而您实际上并不需要这样做。您可以使用re.findall 一口气获得所有匹配项。

最后,字符串开头的-- 似乎是你真正的标记,而不是开头或结尾的\s。那么为什么不将--([0-9a-fA-F]+)(?:--)? 与十六进制数字周围的组一起使用。 findall 只返回你想要的组。然后你可以这样做(将整个 html 文件读入一个字符串,并检查所有匹配项):

text = """
<input type="checkbox" name="checkbox" id="checkboxKG3" class
--D2CBA65440D
<a>    --77094A27E09--  </a>
  hello world  --77094A27E
--770--
    --77094A27E09
Content-T="checkboxKG" value="KG3" />
"""
import re
hexapattern = r'--([0-9a-fA-F]+)(?:--)?'
print re.findall(hexapattern, text)
>>> ['D2CBA65440D', '77094A27E09', '77094A27E', '770', '77094A27E09']

我认为这是你想要的

【讨论】:

【参考方案2】:

我使用了以下内容:

pattern = re.compile(r'(\n--)([0-9A-F]+)(--)?', re.I | re.S | re.M)

而且效果很好。感谢您的所有贡献。

【讨论】:

只是,仅供参考,如果它位于缓冲区的开头,这将与模式不匹配。使用以色列提到的^ 可以在任何行的开头找到它。【参考方案3】:
import re
hexaPattern = re.compile(r'\s--([0-9a-fA-F]+)(?:--)?\s')
m = re.search(hexaPattern, part)
if m:
   print "found a match:", m.group(1)

这会预编译模式以提高速度。这使用r''(原始字符串),因此反斜杠肯定会正确传递。这会添加括号以创建“匹配组”,以便您可以在匹配后提取十六进制字符串;它还在第二个-- 字符串周围添加了一个“不匹配组”。

因为您在第二个“--”周围使用了方括号,所以您得到了一个“字符类”。我不确定字符类 [--] 到底匹配什么;我认为它应该与任何 '-' 字符匹配。在字符类中,“-”通常用于范围,如[a-z],但范围[--] 没有意义,所以我认为它会退回到仅匹配'-'。问题是:因为后面有 ?,它只能匹配零个或一个 '-' 字符,而您需要它能够匹配两个。

【讨论】:

值得一提的是,如果你使用了很多不同的模式,你只需要编译模式。根据python re docs 的说法,这些值是缓存的,所以如果你只使用几个模式,编译它们不会有什么用。【参考方案4】:

试试这个: hexaPattern = r"^--[0-9a-fA-F]+(--)?\s"

我插入的修复是:

r 开头,这样反斜杠就不会被引号“吃掉”

^ 在开头匹配字符串的开头

然后将-- 放在括号中而不是方括号中(括号似乎是一个错误)

【讨论】:

你不想从一开始就匹配。 OP 的十六进制值嵌入到较长的 html 字符串中。

以上是关于python中十六进制字符串的正则表达式不起作用的主要内容,如果未能解决你的问题,请参考以下文章

字符串形式的正则表达式在 Ruby 中不起作用

二十正则介绍grep上grep中grep下

Node.js 正则表达式不起作用[重复]

正则表达式在 Sed 中不起作用

根据十六进制值从字符串中删除特定字符

正则表达式正后面看起来不起作用?