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

如何按大写字符与数字拆分字符串?以"H2SO4liH2"为例

Hey,这个化学式拆分的需求我刚好碰到过!用正则表达式就能完美解决,下面给你对应两种目标格式的Python实现方案:

方案1:生成「元素+数字」的组合数组

核心思路是用正则匹配完整的元素单元——大写字母开头,可选小写后缀,再跟可选的数字。如果原字符串里的li是输入时的小写失误(毕竟化学式里元素首字母都是大写),可以先做个简单的格式修正:

import re

raw_formula = "H2SO4liH2"
# 修正小写开头的元素,把单独的小写字母转成大写(确保符合化学式规范)
formula = re.sub(r'(?<![A-Z])[a-z]', lambda m: m.group().upper(), raw_formula)
# 匹配元素+数字的组合
result = re.findall(r'[A-Z][a-z]?\d*', formula)
print(result)  # 输出: ['H2', 'S', 'O4', 'Li', 'H2']

正则规则说明:

  • [A-Z]:匹配元素的大写首字母(符合化学命名规范)
  • [a-z]?:匹配可选的小写次字母(比如Li、Mg这类双字母元素)
  • \d*:匹配0个或多个数字(没有数字的元素就只保留元素符号,比如S)
方案2:生成「元素单独+数字单独」的拆分数组

这个需要把元素和数字分开提取,我们用带捕获组的正则遍历每个匹配项,分别把元素和非空数字加入结果列表:

import re

raw_formula = "H2SO4liH2"
formula = re.sub(r'(?<![A-Z])[a-z]', lambda m: m.group().upper(), raw_formula)
result = []
# 用两个捕获组分别匹配元素和数字
for match in re.finditer(r'([A-Z][a-z]?)(\d*)', formula):
    # 添加元素符号
    result.append(match.group(1))
    # 数字不为空时才添加(避免空字符串混入)
    number = match.group(2)
    if number:
        result.append(number)
print(result)  # 输出: ['H', '2', 'S', 'O', '4', 'Li', 'H', '2']

这样就能精准得到你想要的两种数组格式啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:38:42