我有一个正则表达式来匹配字符串,例如:
--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" />
我做错了什么?
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]
所示,但范围 [--]
没有任何意义,所以我认为它会回退到仅匹配 '-'
。 问题是:因为后面有 ?
,所以它只能匹配零个或一个 '-'
字符,而你需要它能够匹配两个。
试试这个:
hexaPattern = r"^--[0-9a-fA-F]+(--)?\s"
我插入的修复是:
r 在开头,这样反斜杠就不会被引号“吃掉”
^ 位于开头以匹配字符串的开头
然后
--
放在括号中而不是方括号中(括号看起来像是一个错误)
其他人指出了你的正则表达式的问题,即
[--]
基本上以一种非常规的方式找到一个连字符......无论如何,都不是你想要的。
我还建议在正则表达式的开头和结尾都有
\s
也会在某些情况下引起问题,因为它匹配 spaces
、tabs
和 newlines
。因此,您最终可能会遇到这样的情况:您的文件有 --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']
我想这就是你想要的
[988f21e7-df59-4669-b950-bd26ccefbba5]这是线程ID的一种类型 [gAo4cUGr] 这是另一个。
你能在Python中编写正则表达式来提取log.txt文件吗
我使用了以下内容:
pattern = re.compile(r'(\n--)([0-9A-F]+)(--)?', re.I | re.S | re.M)
效果很好。感谢您的所有贡献。