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

