我有一个正则表达式来匹配字符串,如:
- 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" />
我做错了什么?
答案 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
也会在某些情况下导致问题,因为它匹配spaces
,tabs
和{{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)
它工作正常。感谢您的所有贡献。