给定一个化学公式,如Al2( SO4 )3,我想格式化它,方法是查看括号中的位置,并将末尾的3乘以括号中的SO4,得到Al2S3O12的输出。我在第40行收到一个语法错误,我怀疑还有更多的错误。我正在寻找我可能做错了什么,以及我如何改进这段代码。如果有帮助的话,我使用repl作为ide。提前谢谢。
def format(equation):
a = 0
equation_list = []
formated = ''
for i in range (len(equation)):
equation_list.append(equation[i])
for i in range(a,len(equation)):
if equation[i] == '(':
opening = equation[i]
elif equation[i] == ')':
closing = equation[i]
a = closing
multiplier = closing+1
break
for i in range(len(equation_list[opening:closing+1])):
if equation_list[i].isupper():
if equation_list[i+1].islower():
if equation_list[i+2].islower():
equation_list.insert(i+3, str(multiplier))
elif equation_list[i+2].isupper():
equation_list.insert(i+3, str(multiplier))
elif equation_list[i+2].isdigit():
equation_list[i+3] *=multiplier
elif equation_list[i+1].isupper():
equation_list.insert(i+1, str(multiplier)
elif equation_list[i+1].isdigit():
equation_list[i+1] *= multiplier
equation_list.remove('(')
equation_list.remove(')')
for i in equation_list:
formated += equation_list[i]
return formated
print(format('Na(Cl)2'))发布于 2021-04-21 07:05:37
这将处理嵌套的括号和两位数的乘数。它不会像'(CH2OH)3‘那样将分离的原子组合在一起,但这可能是一种练习。
def format(equation):
parts = []
partial = 0
for char in equation+' ':
if char.isnumeric():
partial = partial * 10 + int(char)
continue
if partial:
if parts[-1] == ')':
parts.pop()
i = -1
while parts[i] != '(':
parts[i][1] *= partial
i -= 1
else:
parts[-1][1] = partial
partial = 0
if char.isupper():
parts.append( [char, 1] )
elif char.islower():
parts[-1][0] += char
elif char == '(':
parts.append('(')
elif char == ')':
parts.append(')')
build = []
for part in parts:
print(part)
if part == '(':
continue
if part[1] == 1:
build.append( part[0] )
else:
build.append( part[0] + str(part[1]))
return ''.join(build)
print(format('Al2(SO4)3'))
print(format('Al2((SO4)3)10'))发布于 2021-04-21 07:09:11
我真的建议使用re (regex模块)来解决这个问题。我想出的代码是:
import re
def format(equation):
parantheses_regex = "\((?P<inner_equation>[A-Za-z\d]+)\)(?P<multipli_number>\d+)"
get_inner_values = "(?P<symb>[A-Z]([a-z])?)(?P<number>\d+)?"
search_parantheses = re.finditer(parantheses_regex, equation)
for value in search_parantheses:
multipli = value.group("multipli_number")
inner_equation = value.group("inner_equation")
search_equation = re.finditer(get_inner_values, inner_equation)
new_inner = ""
for inner_symb in search_equation:
number = inner_symb.group("number")
symb = inner_symb.group("symb")
if number == None:
number = 1
number = int(number)
new_inner += symb + str(number * int(multipli))
equation = re.sub("\(" + value.group(1) + "\)(?P<multipli_number>\d+)", new_inner, equation)
return equation
print(format("Al2(SO4)3")) 输出:
Al2S3O12https://stackoverflow.com/questions/67187031
复制相似问题