使用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
相关产品推荐
相关产品推荐

