如何按P、D、R拆分字符串并按字母组求和转列?
拆分字符串并按P/D/R分组求和的最优方法
给定字符串 P12D1P13D1P2D47R1D37P3D1R10D10,我们需要拆分出所有P、D、R后面的数字,分别求和后整理为如下列格式:
| P | D | R |
|---|---|---|
| 30 | 97 | 11 |
以下是不同场景下的最优实现方法:
Excel(适用于数据表批量处理)
如果使用Excel 365或新版Excel,可直接用函数组合实现:
- P列求和:
=SUM(TEXTBEFORE(TEXTAFTER(A1,"P",SEQUENCE(LEN(A1)-LEN(SUBSTITUTE(A1,"P","")))),{"D","R"})) - D列求和:把公式里的"P"替换成"D",
{"D","R"}替换成{"P","R"} - R列求和:把公式里的"P"替换成"R",
{"D","R"}替换成{"P","D"}
也可以用FILTERXML更灵活处理:
- 先将字符串转换为XML结构:
="<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"P","</s><s>P"),"D","</s><s>D"),"R","</s><s>R")&"</s></t>" - 对P求和:
=SUM(FILTERXML(B1,"//s[starts-with(.,'P')]/substring(.,2)")),同理替换字母即可得到D、R的和。
Python(适用于编程或自动化处理)
用正则表达式提取所有字母-数字对,再分组求和是最简洁的方式:
import re target_str = "P12D1P13D1P2D47R1D37P3D1R10D10" # 提取所有P/D/R后跟数字的匹配项 matches = re.findall(r'([PDR])(\d+)', target_str) sum_result = {'P': 0, 'D': 0, 'R': 0} for char, num in matches: sum_result[char] += int(num) # 输出结果 print(sum_result) # 输出: {'P': 30, 'D': 97, 'R': 11} # 如果需要转为表格格式,用pandas import pandas as pd result_df = pd.DataFrame([sum_result]) print(result_df)
Power Query(适用于Excel数据表批量转换)
适合处理整张数据表的批量转换:
- 将数据表导入Power Query,选中字符串列
- 添加自定义列,用正则提取所有匹配项:
= List.Transform(Regex.Matches([字符串列], "([PDR])(\d+)"), each [Letter = _.Groups(1).Value, Number = Number.From(_.Groups(2).Value)]) - 展开这个列表列,得到每行的字母和数字
- 按"Letter"列分组,对"Number"列求和
- 最后转置结果,得到P/D/R为列名的表格
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

