Python的正则表达式:精确匹配字符串长度

4

我正在尝试编写一个正则表达式来获取哈希值,目前我已经有了可以捕获MD5哈希值的以下正则表达式:

[0-9a-fA-F].{32}

然而,这也会获取较长字符串(例如SHA-1哈希)的前32个字符。我想知道如何编辑它以确保只有在字符串长度为32个字符而不是40个字符时才匹配?

编辑:抱歉,我应该说我正在使用Python 2.7。


4
请使用锚点 (^[0-9a-fA-F]{32}$) 或 re.fullmatch - Sebastian Proske
4
为什么在这里使用点号? - Dmitry
@Dmitry 确切地说:这将匹配当前状态下的33个字符(Sebastian已更新他的评论 :)) - Jean-François Fabre
3个回答

4
要匹配MD5哈希值的完整字符串,请使用起始和结束锚点^和$:
s = "3b4e1a15682994ef0bb2cbea8abfa105"
result = re.search(r'^[0-9a-fA-F]{32}$', s)

print result.group()   # 3b4e1a15682994ef0bb2cbea8abfa105

要将MD5哈希值作为文本的子字符串进行匹配,请使用单词边界\b
s = "hash 3b4e1a15682994ef0bb2cbea8abfa105 some text"
result = re.search(r'\b[0-9a-fA-F]{32}\b', s)

print result.group()    # 3b4e1a15682994ef0bb2cbea8abfa105

@user7399815,这是非常奇怪的行为,但它将使用re.search(r'\b[0-9a-fA-F]{127}\b', s)匹配128位哈希值。 - RomanPerekhrest

2

你的正则表达式中有一个小错误(但非常重要)- [0-9a-fA-F].{32} 匹配一个十六进制字符和 32 个任意字符(除了换行符)。因此,你的模式应该是 [0-9a-fA-F]{32}

为了检查整个字符串是否匹配,你可以使用 re.fullmatchPython 3.4 中添加)或者使用锚点 ^(字符串开始)和 $(字符串结束)


1

你能贴出一些示例字符串吗?每个字符串的长度为32或40个字符。

如果没有示例,我可以考虑使用^$来匹配字符串的开头和结尾,就像Python re教程中所解释的那样。

示例:

^[0-9a-fA-F]{32}$

这里是一些长度为32(MD5)和40(SHA-1)的哈希示例。 9c3aec2376f1052a95d8de480a37572f,566dd7d858598375eaa7f468379447c673d934e2 - user7399815

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接