7

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

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

4 回答 4

11
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''(原始字符串),因此反斜杠肯定会正确传递。这会添加括号以创建“匹配组”,以便您可以在匹配后提取十六进制字符串;它还在第二个--字符串周围添加了一个“非匹配组”。

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

于 2012-04-22T17:54:08.990 回答
4

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

我插入的修复是:

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

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

然后--用括号代替方括号(括号似乎是一个错误)

于 2012-04-22T17:49:28.833 回答
0

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

我还建议\s在正则表达式的开头和结尾都有在某些情况下也会导致问题,因为它匹配spaces,tabsnewlines. 因此,您最终可能会遇到您的文件具有--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']

我认为这是你想要的

于 2012-04-22T19:30:12.457 回答
-2

我使用了以下内容:

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

它工作得很好。感谢您的所有贡献。

于 2012-04-25T21:27:42.147 回答