我不确定我的原子量是否正确,但我想这可以解决。
对我来说棘手的一点是试图找出像 CH3 这样简单的(字母)(数字)正则表达式不起作用的情况。
re.findall 在这里完成了繁重的工作。可能有更好的方法来解析 C2H4 字符串,我会对它感兴趣,但这有效。显然你可以清理东西并制作更整洁的功能等。
但是这里的正则表达式,我怀疑你最感兴趣的是:寻找一串字母,大写或小写,然后是一串数字。这被传递给 calc_weight,它将字符串分成字母和数字。如果有的话,这些字母会被发送到一个原子量。如果不是,则抛出错误。然后权重乘以数字。
import re
import sys
weight = { 'cl': 30, 'n': 8, 'o': 12, 'c': 6, 'h': 2 }
def calc_weight(my_str):
elt = my_str[1].lower()
if not re.search("[0-9]", my_str[0]): amt = 1
else: amt = re.sub("^[a-zA-Z]+", "", my_str[0])
if elt not in weight: sys.exit(elt + " is not a valid element.")
return int(amt) * weight[elt]
my_string = "C2H4"
a = re.findall("((Cl|H|O|C|N)[0-9]*)", my_string)
my_weight = 0
for b in a:
my_weight += calc_weight(b)
print("Weight of", my_string, "is", my_weight)
代码上的一句话:my_str[0] 和 my_str[1] 是 findall 元组的一部分,因为我有两对括号。第一个是整体字符串,第二个是元素。
希望这会有所帮助。请注意,您可能可以改进代码:为错误的字符串抛出更好的错误消息等。但我想至少允许大写,例如如果有人输入了 Mg 或 MG,那应该没什么区别。