Python正则无法正确捕获${project_version},求排查正则问题
正则表达式匹配问题分析
你的正则表达式re.match(r'collect_(.*)_(?:(?:foot|arm|height)\d+cm_)+.*' , string)匹配结果不符合预期,核心问题出在贪婪匹配的行为上:
(.*)是贪婪模式,会尽可能多地捕获字符,直到遇到最后一个能让后续正则片段(?:(?:foot|arm|height)\d+cm_)+匹配成功的下划线。这会导致捕获的${project_version}包含了本该属于后面${part}${length}cm_模式的内容(比如第一个字符串中,.*会把project_stage1_20220927_foot60cm_arm70cm都捕获进去,而非真正的项目版本部分)。
修正方案
将贪婪匹配改为非贪婪匹配,让捕获的内容在遇到第一个符合${part}${length}cm_模式的前缀下划线时就停止:
re.match(r'collect_(.*?)_(?:(?:foot|arm|height)\d+cm_)+.*' , string)
关键调整说明
- 把
(.*)替换为(.*?):非贪婪匹配会优先匹配最少的字符,一旦后续的_(?:(?:foot|arm|height)\d+cm_)片段能匹配成功,就停止捕获,这样就能精准拿到${project_version}部分。 - 以第一个输入字符串为例,
.*?会准确捕获project_stage1_20220927,正好是需要的项目版本内容,后续的下划线和foot60cm_会触发匹配终止。
内容的提问来源于stack exchange,提问作者Richard Zheng
相关产品推荐
相关产品推荐

