试图对化学方程式的格式进行改进



如果输入了Na(Cl2)3Al(AlCl2)4之类的东西,我正试图在没有任何库的情况下制作一个程序,但我制作的代码不起作用,我不知道为什么。

有人能告诉我哪里出了问题吗(或者帮我解决(?示例输入的输出应该看起来像CCD_ 2,其中括号也被移除。提前感谢您的帮助。


def format(equation):
equation_list = list(equation)
formated = ''

for i in range(len(equation_list)): 
if equation_list[i] == '(':
opening = i
if equation_list[i] == ')':
closing = i


for i in range(opening+1,closing):
if equation_list[i].isdigit():
equation_list[i] = str(int(equation_list[i])*mult)

if equation_list[i].upper():
if equation_list[i+1].isupper():
equation_list[i+1] = str(mult)
elif equation_list[i+1].isdigit():
equation_list[i+1] = str(int(equation_list[i+1])*mult)
else:
if equation_list[i+2].isupper():
equation_list[i+2] = str(mult)
elif equation_list[i+2].isdigit():
equation_list[i+2] = str(int(equation_list[i+2])*mult)
else:
if equation[i+3].isdigit():
equation_list[i+3] = str(int(equation_list[i+3])*mult)
else:
equation[i+3] = str(mult)

for i in equation_list:
formated+=i

return formated
print(format('Na(Cl2)3Al(AlCl2)4'))

由于指出的重复没有得到投票通过的答案,我想提出一个基于正则表达式的答案。我很确定它不符合所有的情况,但至少你的

import re
EQ_PATTERN = re.compile(r"([A-Z][a-z]+d*|((?:[A-Z][a-z]+d*)+)d*)")
BLOCK_PATTERN = re.compile(r"(((?:[A-Z][a-z]+d*)+))(d*)")
ELEMENT_PATTERN = re.compile(r"([A-Z][a-z]+)(d*)")
def format_element(element: str, amount: str, factor: int):
return f"{element}{int(amount or '1') * factor}"
def format_block(block: str):
if '(' not in block:
return block
inside, factor = BLOCK_PATTERN.findall(block)[0]
return "".join(format_element(element, amount, int(factor))
for element, amount in ELEMENT_PATTERN.findall(inside))
def format_equation(eq: str):
return "".join(map(format_block, EQ_PATTERN.findall(eq)))

通过一些测试

for eq in ('(Al3Cl2Ag6Au)4', 'Na(Cl2)3Al(AlCl2)4', 'Na2(Cl2)3Al(Al3Cl2)4'):
print(f"{eq:20s} ==> {format_equation(eq)}")
(Al3Cl2Ag6Au)4       ==> Al12Cl8Ag24Au4
Na(Cl2)3Al(AlCl2)4   ==> NaCl6AlAl4Cl8
Na2(Cl2)3Al(Al3Cl2)4 ==> Na2Cl6AlAl12Cl8

最新更新