如果输入了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