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

时间:2012-04-22 17:43:11

标签: python regex hex

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

  

- 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" />

我做错了什么?

4 个答案:

答案 0 :(得分:10)

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],但范围[--]没有任何意义所以我认为它会回退到只匹配'-' 。问题是:因为你之后有?,它只匹配零个或一个'-'字符,你需要它才能匹配两个。

答案 1 :(得分:4)

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

我插入的修正是:

r开头,因此反斜杠不会被引号“吃掉”

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

然后在括号中加--而不是方括号(括号看起来像是一个错误)

答案 2 :(得分:0)

其他人已经指出了你的正则表达式的问题,即[--]基本上以非传统方式找到一个连字符......无论如何,不​​是你想要的。

我还建议在正则表达式的开头和结尾都使用\s也会在某些情况下导致问题,因为它匹配spacestabs和{{1 }}。因此,您最终可能会遇到newlines和第二个--77094A27E09\n--D2CBA65440D不匹配的情况,因为换行符在上一场比赛结束时由--D2CBA65440D消耗。

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

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

findall

我认为你想要的是什么

答案 3 :(得分:-1)

我使用了以下内容:

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

它工作正常。感谢您的所有贡献。