【问题标题】:SHA1 string regex for python [duplicate]python的SHA1字符串正则表达式[重复]
【发布时间】:2015-11-20 22:31:10
【问题描述】:

我需要检查一个字符串是一个有效的 SHA1 字符串,比如

 '418c1f073782a1c855890971ff18794f7a298f6d'

我不知道这个规则,例如数字和字母是否是必须的?或者最少有多少个数字或字母?

有人可以建议任何正则表达式在 python 中进行匹配吗?

【问题讨论】:

    标签: python regex sha1


    【解决方案1】:

    我相信避免使用正则表达式会更快。 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
    

    【讨论】:

    • 我喜欢这个。非常聪明!
    • 在控制流中使用 try-catch 块不应该是一种反模式吗?诚实的问题,不是批评,只是想学习。
    • @slashCoder 我不知道,我是白胡子,但它更高效。
    • 在 python 中特别有一个风格原则“更容易请求宽恕而不是许可”,有些人实际上将不使用 try-except 标记为反模式docs.quantifiedcode.com/python-anti-patterns/readability/…,但将其与一粒盐。其他社区对此想法并不热情​​。
    • 很酷!根据timeit 在使用 python 3.7.7 的 Mac 上的测量结果,这比正则表达式的性能大约高 5 倍(即使模式是预先编译的)。
    【解决方案2】:

    使用这个正则表达式:

    \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
    

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多