首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单化学公式的形成

简单化学公式的形成
EN

Stack Overflow用户
提问于 2021-04-21 06:24:23
回答 2查看 54关注 0票数 0

给定一个化学公式,如Al2( SO4 )3,我想格式化它,方法是查看括号中的位置,并将末尾的3乘以括号中的SO4,得到Al2S3O12的输出。我在第40行收到一个语法错误,我怀疑还有更多的错误。我正在寻找我可能做错了什么,以及我如何改进这段代码。如果有帮助的话,我使用repl作为ide。提前谢谢。

代码语言:javascript
复制
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'))
EN

回答 2

Stack Overflow用户

发布于 2021-04-21 07:05:37

这将处理嵌套的括号和两位数的乘数。它不会像'(CH2OH)3‘那样将分离的原子组合在一起,但这可能是一种练习。

代码语言:javascript
复制
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'))
票数 0
EN

Stack Overflow用户

发布于 2021-04-21 07:09:11

我真的建议使用re (regex模块)来解决这个问题。我想出的代码是:

代码语言:javascript
复制
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"))    

输出:

代码语言:javascript
复制
Al2S3O12
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67187031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档