作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定类似 Na(Cl2)3Al(AlCl2)4
的输入我正在尝试制作一个没有任何库的程序来执行此操作,而我制作的代码不起作用,我无法弄清楚原因。
有人可以告诉我我哪里出错了(或帮我解决)?示例输入的输出应类似于 NaCl6AlAl4Cl8
其中括号也被删除。提前感谢您的帮助。
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'))
最佳答案
如 pointed duplicate没有投票回答,我想根据正则表达式提出一个。我很确定它不匹配所有情况,但至少你的
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
关于python - 试图制作程序来格式化化学方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67220920/
我是一名优秀的程序员,十分优秀!