code: def from_string(species_string: str):
          
          m = re.search(r"([A-Z][a-z]*)([0-9.]*)([+\-])(.*)", species_string)
          if m:
              sym = m.group(1)
              oxi = 1 if m.group(2) == "" else float(m.group(2))
              oxi = -oxi if m.group(3) == "-" else oxi
              properties = None
              if m.group(4):
                  toks = m.group(4).replace(",", "").split("=")
                  properties = {toks[0]: float(toks[1])}
              return Specie(sym, oxi, properties)
          else:
              raise ValueError("Invalid Species String")
docs: Returns a Specie from a string representation.
  
          Args:
              species_string (str): A typical string representation of a
                  species, e.g., "Mn2+", "Fe3+", "O2-".
  
          Returns:
              A Specie object.
  
          Raises:
              ValueError if species_string cannot be intepreted.