【发布时间】:2015-11-20 22:31:10
【问题描述】:
我需要检查一个字符串是一个有效的 SHA1 字符串,比如
'418c1f073782a1c855890971ff18794f7a298f6d'
我不知道这个规则,例如数字和字母是否是必须的?或者最少有多少个数字或字母?
有人可以建议任何正则表达式在 python 中进行匹配吗?
【问题讨论】:
我需要检查一个字符串是一个有效的 SHA1 字符串,比如
'418c1f073782a1c855890971ff18794f7a298f6d'
我不知道这个规则,例如数字和字母是否是必须的?或者最少有多少个数字或字母?
有人可以建议任何正则表达式在 python 中进行匹配吗?
【问题讨论】:
我相信避免使用正则表达式会更快。 SHA1 是一个随机的 40 位十六进制数,因此如果您不能将其转换为十六进制且长度不是 40 个字符,则它不是 SHA1:
def is_sha1(maybe_sha):
if len(maybe_sha) != 40:
return False
try:
sha_int = int(maybe_sha, 16)
except ValueError:
return False
return True
【讨论】:
timeit 在使用 python 3.7.7 的 Mac 上的测量结果,这比正则表达式的性能大约高 5 倍(即使模式是预先编译的)。
使用这个正则表达式:
\b[0-9a-f]{40}\b
因为它是一个正好有 40 个字符的十六进制字符串。您也可以按照下面另一个答案中的建议将其转换为整数,但是,这是正则表达式解决方案。
一个例子:
import re
pattern = re.compile(r'\b[0-9a-f]{40}\b')
match = re.match(pattern, '418c1f073782a1c855890971ff18794f7a298f6d')
print match.group(0) # 418c1f073782a1c855890971ff18794f7a298f6d
【讨论】: