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

如何用Python re模块实现按除连字符外的数学运算符分割字符串?

解决正则分割时丢失字符的问题

你当前的代码出现字符丢失的问题,核心原因是正则表达式的匹配逻辑不对:

  • 你用的[0-9][+/*\-][A-Za-z]会完整匹配数字+运算符+字母这个三元组,re.split执行时会把这个三元组整个移除,所以才会出现2018变成201、You变成ou的情况。
  • 另外你误将连字符-加入了运算符集合,而你明确要求排除连字符,这也导致2018-You里的连字符被错误当成了分隔符。

修正方案

我们需要只把目标数学运算符(+、*、/)作为分隔符,同时确保分割时不会“吃掉”运算符前后的字符。这里可以用零宽断言来精准定位分割位置,让正则只匹配运算符本身,同时限定它的上下文(前面是数字、后面是字母,避免误匹配其他场景的运算符)。

修正后的代码:

import re

dummy_string = "I Dont_Know The-Meaning_2018-You Know_Meaning_2017+You Know_Meaning_2017"
# 仅匹配数字后、字母前的+/*/运算符,零宽断言确保不消耗前后字符
string_list = re.split(r'(?<=[0-9])[+/*](?=[A-Za-z])', dummy_string)
print(string_list)

输出结果:

['I Dont_Know The-Meaning_2018-You Know_Meaning_2017', 'You Know_Meaning_2017']

额外需求适配(如果需要包含数字-字母间的减号)

如果你的实际需求是把数字和字母之间的-(作为减号)也当成分隔符(从你的期望输出看可能有这个隐含需求),只需把-加入运算符集合,同样用零宽断言限定上下文,避免误匹配单词中间的连字符(比如The-Meaning里的):

string_list = re.split(r'(?<=[0-9])[+/*-](?=[A-Za-z])', dummy_string)

输出结果:

['I Dont_Know The-Meaning_2018', 'You Know_Meaning_2017', 'You Know_Meaning_2017']

正则逻辑解释

  • (?<=[0-9]):正向后行断言,确认前面是一个数字,但不会消耗这个数字(也就是分割后数字会保留)。
  • [+/*]:匹配你需要的数学运算符(如需加入减号则改为[+/*-])。
  • (?=[A-Za-z]):正向先行断言,确认后面是一个字母,同样不会消耗这个字母(分割后单词首字母会保留)。

这样re.split只会移除运算符本身,完全保留前后的内容,解决你当前的字符丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:14