如何使用Python正则表达式仅删除星号包裹内容中的数字
问题原因
你原来使用的正则\*.*\*会直接匹配一对星号之间的全部内容,直接替换为空自然会把星号包裹的所有内容都清空。要实现仅删除星号内的数字、保留星号外数字的需求,需要用嵌套替换的逻辑实现。
正确实现代码
import re msg = """ 1 x * Build your pizza * ($ 99MXN) 1 x * Baitz Cinnamon 16 pieces * ($ 44.50 MXN) 1 x * Potatoes 220 g * ($ 44.50 MXN) """ # 外层匹配所有星号包裹的片段,内层单独删除片段内的数字 res = re.sub(r'\*(.*?)\*', lambda match: f'*{re.sub(r"\d+", "", match.group(1))}*', msg) print(res)
代码说明
- 外层正则
\*(.*?)\*用非贪婪匹配,精准定位每一对星号包裹的内容,不会出现跨段匹配的问题 - 替换回调函数中,仅对星号内部的内容执行数字删除操作,处理完成后再把星号加回去,完全不影响星号外的所有内容
- 数字匹配规则
\d+只会匹配连续的数字字符,不会影响文字、空格等其他内容
运行输出
1 x * Build your pizza * ($ 99MXN) 1 x * Baitz Cinnamon pieces * ($ 44.50 MXN) 1 x * Potatoes g * ($ 44.50 MXN)
内容的提问来源于stack exchange,提问作者CAPOH A.C
相关产品推荐
相关产品推荐

