使用f-string拼接的UUID4正则表达式匹配失效问题
问题原因与解决方法
核心问题
你用rf字符串拼接正则时,正则中的量词语法{8}、{4}等会被f-string当成占位符解析,导致正则结构被破坏,最终匹配失败。
f-string会处理所有包裹在{}里的内容,不管它是不是正则语法。比如你写的{8}会被直接替换成数字8,原本的[a-f0-9]{8}就变成了[a-f0-9]8,完全失去了“匹配8个符合规则的字符”的量词作用,自然匹配不上UUID格式。
解决方法
方法1:转义正则中的{}
在f-string里,用双写的{{和}}表示单个的{和},这样f-string处理后会还原正则的量词语法:
#!/usr/bin/python3 import re PATH_PREFIX = "/a/b/c" path = "/a/b/c/e72cc82c-e83a-431c-9f63-c8d80eec9307" if re.match(rf"{PATH_PREFIX}/[a-f0-9]{{8}}-[a-f0-9]{{4}}-4[a-f0-9]{{3}}-[89aAbB][a-f0-9]{{3}}-[a-f0-9]{{12}}$", path): print("matched") else: print("didn't match anything")
方法2:拆分字符串拼接
把固定前缀和raw正则部分分开拼接,避免f-string解析正则里的{}:
#!/usr/bin/python3 import re PATH_PREFIX = "/a/b/c" path = "/a/b/c/e72cc82c-e83a-431c-9f63-c8d80eec9307" regex = PATH_PREFIX + r"/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$" if re.match(regex, path): print("matched") else: print("didn't match anything")
补充说明
你之前用f-string处理正则能正常运行,大概率是当时的正则里没有{}这类会被f-string解析的语法,或者采用了其他不会触发f-string占位符解析的拼接方式。
内容的提问来源于stack exchange,提问作者Qiang Xu
相关产品推荐
相关产品推荐

