You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中用单个正则表达式替换字符串至err/error前内容的方法

问题

需求:把字符串里err或error出现之前的所有内容替换为空,比如:

  • "abc err efg" → "efg"
  • "abc error efg" → "efg"

想通过单个正则表达式用re.sub实现,我试了下面的代码,但触发了KeyError,期望输出是:

hello
hello

尝试的代码:

lines_input = ['some line err hello', 'some line error hello']
rep = {r'^.*?err': '', r'^.*?error': ''}
dict((re.escape(k), v) for k, v in rep.items())
pattern = re.compile("|".join(rep.keys()))
for line in lines_input:
     print(pattern.sub(lambda m: rep[re.escape(m.group(0))], line))
解决方法

代码出错原因

你生成了转义后的键值对但没存到变量里,而且用re.escape(m.group(0))去匹配原字典的未转义键,肯定找不到对应值,所以出现KeyError。

单正则实现方案

不用搞字典映射,直接写一个能匹配err/error及之前所有内容的正则就行,注意把error放在err前面,让正则优先匹配更长的字符串,避免error被拆成err处理。

正确代码示例:

import re

lines_input = ['some line err hello', 'some line error hello']
pattern = re.compile(r'^.*?(error|err)')
for line in lines_input:
    print(re.sub(pattern, '', line).strip())

更简洁的写法(自动去掉err/error后的空格):

import re

lines_input = ['some line err hello', 'some line error hello']
for line in lines_input:
    print(re.sub(r'^.*?(?:error|err)\s*', '', line))

正则说明

  • ^.*?(?:error|err):^匹配字符串开头,.*?是非贪婪匹配任意字符,(?:error|err)是非捕获组,优先匹配error再匹配err,防止截断长匹配。
  • \s*用来匹配err/error后面的空格,替换后结果更整洁。
  • 用re.sub把匹配到的内容换成空字符串,直接得到目标结果。

内容的提问来源于stack exchange,提问作者Michello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:32:12