如何根据前缀运算符(+/-)将字符串中的数字拆分至两个列表?
问题描述
现有字符串示例:
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
相关产品推荐
相关产品推荐

