【问题标题】:Python regular expression for exact string length用于精确字符串长度的 Python 正则表达式
【发布时间】:2017-07-30 03:26:12
【问题描述】:

我正在尝试编写一个将获得哈希的正则表达式,目前我有以下正则表达式可以捕获 MD5 哈希

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

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

编辑:对不起,我应该说我使用的是 Python 2.7

【问题讨论】:

  • 使用锚点 (^[0-9a-fA-F]{32}$) 或 re.fullmatch
  • 这里为什么用点?
  • @Dmitry 确切地说:这将匹配当前状态下的 33 个字符(塞巴斯蒂安更新了他的评论 :))

标签: python regex python-2.7


【解决方案1】:

要匹配整个字符串的 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,这真是奇怪的行为,但它会匹配 128 位哈希与 re.search(r'\b[0-9a-fA-F]{127}\b', s)
【解决方案2】:

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

要检查整个字符串是否匹配,您可以使用re.fullmatch (added in Python 3.4) 或使用锚点^(字符串开头)和$(字符串结尾)

【讨论】:

    【解决方案3】:

    您能否粘贴一些示例字符串(长度分别为 32 和 40)?

    如果没有示例,我可以考虑使用^$ 来匹配字符串的开头和结尾,如Python re tutorial 中所述。

    例子:

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

    【讨论】:

    • 以下是一些哈希长度为 32 (MD5) 和 40 (SHA-1) 的示例。 9c3aec2376f1052a95d8de480a37572f , 566dd7d858598375eaa7f468379447c673d934e2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多