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

使用re.sub提取等号前内容失败,为何返回'F0None'而非'F0'?

问题

想要提取表达式中等号(=)之前的第一部分内容,尝试以下代码后未得到预期结果:

import re

re.sub('(.*?)=(.*?)', r'\1', 'F0=None')

代码返回F0None,但预期应该是F0,这是为什么?

原因

re.sub的作用是替换字符串中匹配正则的部分,未被正则匹配到的内容会原封不动保留下来。

你的正则(.*?)=(.*?)用了非贪婪匹配(.*?):

  • 第一个.*?匹配到F0,接着匹配到=
  • 第二个.*?是贪婪度最低的匹配,会直接匹配空字符串(非贪婪模式下,能匹配0个字符就不会多匹配)

所以整个正则实际只匹配了F0=这部分,替换成\1(也就是F0)后,原字符串中未被匹配的None会被保留,最终结果就是F0+None=F0None。

解决办法

方法1:用re.search直接提取捕获组(更推荐)

不需要替换,直接定位匹配的内容:

import re

result = re.search('(.*?)=', 'F0=None').group(1)
print(result)  # 输出 F0

方法2:修改正则匹配整个字符串

让正则覆盖整个输入字符串,这样替换后就只剩捕获组内容:

import re

result = re.sub('(.*?)=(.*)', r'\1', 'F0=None')
print(result)  # 输出 F0

这里把第二个.*?改成.*(贪婪匹配),会匹配=之后的所有内容,整个字符串都会被匹配到,替换后就只剩下\1的内容。

方法3:不用正则,直接字符串分割

如果字符串里只有一个=,用split更简单:

result = 'F0=None'.split('=')[0]
print(result)  # 输出 F0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:52:35