如何用Python正则匹配GPG签名?代码报错求修复指导
GPG签名正则匹配问题修复
问题概述
尝试用正则表达式匹配Git日志中的GPG签名块时,触发了DeprecationWarning警告,且原正则无法正确匹配目标内容。
错误原因
- 模式标志位置错误:正则中的
(?s)(单行模式,让.匹配换行符)被放在表达式中间,Python的re模块要求这类内联标志必须置于正则开头,否则会触发弃用警告。 - 正则语法错误:原正则里
-----BEGIN SIGNED MESSAGE------{3,}多写了一个横杠,且错误使用$和^锚点(默认匹配整个字符串首尾,而非行首尾),导致匹配逻辑失效。
修复方案
- 调整模式标志:将单行模式通过
re.DOTALL(等价于(?s))作为re.search的flags参数传入,避免内联标志位置问题。 - 修正正则语法:
- 移除多余横杠,正确匹配
-----BEGIN SIGNED MESSAGE----- - 去掉错误锚点,改为匹配从
gpgsig开头到-----END SIGNED MESSAGE-----结束的整块内容 - 用非贪婪匹配
.*?确保只匹配单个签名块
- 移除多余横杠,正确匹配
修复后的完整代码
import re if __name__ == '__main__': log = ''' tree e76fa5ccd76492d843b6a4a06038d1c3b5aef6f8 parent 0d533a3a5fd51fd8c2x932832ef9ea91d0756c18 author firstname lastname <userid@company.com> 1676061999 -0800 committer firstname lastname <userid@company.com> 1676061999 -0800 gpgsig -----BEGIN SIGNED MESSAGE----- MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B BwEAAKCCAuswggLnMIICjKADAgECAhANVjmYTunVjjNs9EhuJ4YXMAoGCCqGSM49 BAMCME0xKTAnBgNVBAMMIEFmorplIENvcnBvcmF0ZSBTaWduaW5nIEVDQyBDQSAx MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0yMzAyMDkxOTU2 NTlaFw0yMzAzMDIyMDA2NTlaMDIxEzARBgNVBAoMCkFmorplIEluYy4xGzAZBgNV BAMMEmduYWtrYWxhQGFmorplLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA BGwmvh7HYXCyerdERaLr+OOJ3AQxYNSfUorWkROO2xv/ra8yYGL/aBCYJSQUoYRY kY4GE90s8NAUwmQmsthdbFSjggFnMIIBYzAMBgNVHRMBAf8EAjAAMB8GA1UdIwQY MBaAFEJi3AGoy1MCpVzt8IjG9uFJdhE9MHMGCCsGAQUFBwEBBGcwZTAvBggrBgEF BQcwAoYjaHR0cDovL2NlcnRzLmFmorplLmNvbS9hY3NlY2NhMS5kZXIwMgYIKwYB BQUHMAGGJmh0dHA6Ly9vY3NwLmFmorplLmNvbS9vY3NwMDMtYWNzZWNjMTA0MB0G A1UdEQQWMBSBEmduYWtrYWxhQGFmorplLmNvbTAUBgNVHSUEDTALBgkqhkiG92Nk BBQwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL2NybC5hcHBsZS5jb20vYWNzZWNj YTEuY3JsMB0GA1UdDgQWBBR1dRRNvQ/7RwRTorG97HmKR4xoJjAOBgNVHQ8BAf8E BAMCB4AwJQYDVR0gBB4wHDAMBgoqhkiG92NkBRQBMAwGCiqGSIb3Y2QFFAIwCgYI KoZIzj0EAwIDSQAwRgIhAPQ4IiaCG6V5A7u0lwbhJxyXHf9jN2IoqRLj7BlFo4Uv AiEAtJAekfgFoiE3h8ZZDgvhwRiwPJseo8GDfM0tb5DP0h8xggE3MIIBMwIBATBh ME0xKTAnBgNVBAMMIEFmorplIENvcnBvcmF0ZSBTaWduaW5nIEVDQyBDQSAxMRMw EQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUwIQDVY5mE7p1Y4zbPRIbieG FzANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJ KoZIhvcNAQkFMQ8XDTIzMDIxMDIwNDY1MFowLwYJKoZIhvcNAQkEMSIEIP8j8iYG Ggpc74AeVdxLkIArVBLw3+vw6/FVmGtNig+uMAkGByqGSM49AgEERjBEAiB0dBI3 9c1b/bsStaT3blWb19ehQDt8J/NNov/TzSgEzAIgWvpSs/DZI7wmlHtIJ8HpmIp4 +oNOu4kJJlhtUy9ZImUAAAAAAAA= -----END SIGNED MESSAGE----- ''' # 修正后的正则表达式 pattern = r"gpgsig -----BEGIN SIGNED MESSAGE-----\s*.*?\s*-----END SIGNED MESSAGE-----" # 使用re.DOTALL让.匹配换行符 if re.search(pattern, log, flags=re.DOTALL): print("找到匹配项")
说明
re.DOTALL:让正则中的.匹配包括换行符在内的所有字符,确保覆盖多行签名内容\s*:匹配签名块前后的空白字符(包括换行),增强匹配鲁棒性- 非贪婪匹配
.*?:避免误匹配多个签名块(如果日志存在多个的话)
内容的提问来源于stack exchange,提问作者user3508811
相关产品推荐
相关产品推荐

