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

如何根据前缀运算符(+/-)将字符串中的数字拆分至两个列表?

问题描述

现有字符串示例:

string = "6+324-909+5+55-1"

listPositive = []
listNegative = []

需求:

  • 将前缀带有+的数字放入listPositive,前缀带有-的数字放入listNegative,仅保留数字本身
  • 利用运算符区分分类,首个无前缀的数字已处理(无需额外关注)

我是编程新手,想了解多种实现思路或方案。之前试了下面这段代码:

s1='678-6783742+2342+4-8'
lst=s1.split()
sample=[]
for i in lst:
    if '-' in i:
        sample.append(i[1:])
print(sample)

预期输出:

['6783742', '8']

但这段代码只有在字符串里加空格(比如s1='678 -6783742 +2342 +4 -8')时才能正常运行,求解决办法。


方案一:手动遍历字符串分割

核心思路是逐个字符扫过字符串,遇到运算符时记录符号,然后收集后面的连续数字,最后按符号分类。这种方法逻辑清晰,适合新手理解底层过程。

s1 = '678-6783742+2342+4-8'
listPositive = []
listNegative = []

# 先找到第一个运算符的位置,跳过开头的无符号数字
op_indices = []
for idx, char in enumerate(s1):
    if char in '+-':
        op_indices.append(idx)
if not op_indices:
    print("正数列表:", listPositive)
    print("负数列表:", listNegative)
    exit()

start_idx = op_indices[0]
i = start_idx

while i < len(s1):
    # 记录当前运算符(符号)
    sign = s1[i]
    i += 1
    # 收集连续的数字字符
    num_str = ''
    while i < len(s1) and s1[i].isdigit():
        num_str += s1[i]
        i += 1
    # 根据符号把数字加入对应列表
    if sign == '+':
        listPositive.append(num_str)
    elif sign == '-':
        listNegative.append(num_str)

print("正数列表:", listPositive)
print("负数列表:", listNegative)

运行输出:

正数列表: ['2342', '4']
负数列表: ['6783742', '8']

方案二:字符串替换+分割法

通过替换把所有-变成+-,让整个字符串可以用+分割成带符号的数字块,再筛选分类。这种方法代码简洁,不需要复杂循环。

s1 = '678-6783742+2342+4-8'
# 把所有'-'替换成'+-',确保每个数字都带符号
processed_str = s1.replace('-', '+-')
# 按'+'分割字符串
parts = processed_str.split('+')

listPositive = []
listNegative = []

for part in parts:
    # 跳过空字符串和开头的无符号数字
    if not part:
        continue
    if part.startswith('-'):
        # 去掉'-'后加入负数列表
        listNegative.append(part[1:])
    elif part.isdigit() and parts.index(part) != 1:
        # 开头的无符号数字在parts[1],跳过;其余带'+'的数字加入正数列表
        listPositive.append(part)

print("正数列表:", listPositive)
print("负数列表:", listNegative)

方案三:正则表达式匹配(进阶思路)

用正则表达式直接提取所有带+或-前缀的数字,再按符号分类。正则能快速处理复杂字符串,适合新手了解高效提取的思路。

import re

s1 = '678-6783742+2342+4-8'
# 正则规则:匹配'+'或'-',后面跟一个或多个数字
matched_nums = re.findall(r'[+-]\d+', s1)

listPositive = []
listNegative = []

for num in matched_nums:
    if num.startswith('+'):
        listPositive.append(num[1:])
    else:
        listNegative.append(num[1:])

print("正数列表:", listPositive)
print("负数列表:", listNegative)

内容的提问来源于stack exchange,提问作者Ondráš Šponer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:50:34