如何按大写字符与数字拆分字符串?以"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
相关产品推荐
相关产品推荐

