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

python中十六进制字符串的正则表达式不起作用,python,regex,hex,Python,Regex,Hex,我有一个正则表达式来匹配字符串,如: --D2CBA65440D --77094A27E09 --77094A27E --770 --77094A27E09-- 基本上,它匹配由一个或多个换行符或空格包围的十六进制字符串,并以前缀(可能有也可能没有)作为后缀 我使用以下python代码,大多数情况下都可以正常工作: hexaPattern = "\s--[0-9a-fA-F]+[--]?\s" hex = re.search(hexaPattern, part) if 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" />

我做错了什么?

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

我插入的修复程序是:

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

^以匹配字符串的开头

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

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


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

其他人指出了您的正则表达式的问题,即
[-]
,它基本上以非常规方式查找一个连字符。。。不管怎样,都不是你想要的

我还建议在正则表达式的开头和结尾都有
\s
,在某些情况下也会导致问题,因为它匹配
空格
选项卡
、和
换行符
。因此,您可能会遇到这样的情况:您的文件有
--77094A27E09\n--D2CBA65440D
,而第二个
--D2CBA65440D
将不匹配,因为换行符在上一次匹配结束时被
\s
使用

此外,您似乎要单独检查文件中的每一行,而实际上并不需要这样做。您可以使用
re.findall
一次性获得所有比赛

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

text=”“”
"""
进口稀土
hexapattern=r'-([0-9a-fA-F]+)(?:-)?'
打印有关findall的信息(六边形,文本)
>>>['D2CBA65440D','77094A27E09','77094A27E','770','77094A27E09']
我想这就是你想要的

我使用了以下方法:

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

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

尝试修剪两侧的html,直到找到导致问题的字符为止。我找到了该块的匹配项:请注意,
[--]?
将匹配一个或一个破折号,而不是两个破折号。我想你的意思是两个破折号。。。但是
[-]?
有效您不希望从一开始就匹配。OP的十六进制值嵌入在一个较长的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']
pattern = re.compile(r'(\n--)([0-9A-F]+)(--)?', re.I | re.S | re.M)