为什么Python的re.sub()默认会保留正则未匹配的字符串?
为什么re.sub()默认保留未匹配的内容
re.sub() 的核心定位是正则子串替换工具,设计逻辑和 Python 内置的普通字符串替换方法 str.replace() 完全对齐:仅扫描全串、替换所有符合正则规则的子串部分,未匹配到的区域会原封不动保留,这是所有通用字符串替换工具的标准逻辑,它本身不是为「提取匹配内容」的场景设计的。
你之前在正则首尾加 .* 让规则匹配整个字符串的操作,本质是让替换范围覆盖了全部原串,所以最终结果就只剩替换后的内容。
无需匹配整串的简便实现方案
你的需求本质是提取匹配到的尺寸数值,完全不需要用 re.sub() 做绕路的整串替换,直接用正则匹配提取的方法更直观高效,两种常用场景的方案如下:
- 单匹配场景(字符串中只有1个符合规则的size条目):用
re.search()直接提取分组
import re match_res = re.search(r'size:\D+(\d+)\D+(\d+)\D+(\d+)', 'START, size: 100Х200 x 50, END') if match_res: print(f"{match_res.group(1)}x{match_res.group(2)}x{match_res.group(3)}")
运行直接输出预期结果 100x200x50
- 多匹配场景(字符串中有多个符合规则的size条目):用
re.findall()批量提取
import re raw_str = 'size: 100x200x50, other text, size: 30x40x60' match_list = re.findall(r'size:\D+(\d+)\D+(\d+)\D+(\d+)', raw_str) # 拼接为目标格式 print(['x'.join(item) for item in match_list])
运行输出 ['100x200x50', '30x40x60']
内容的提问来源于stack exchange,提问作者Kirby
相关产品推荐
相关产品推荐

