Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save zamiur/f1021e4f67f0e090f32bbedb66575cdb to your computer and use it in GitHub Desktop.
Save zamiur/f1021e4f67f0e090f32bbedb66575cdb to your computer and use it in GitHub Desktop.
import re
# Edit: I'll just put it all into a dictionary insteaad rather than creating one and appending every single one
# This took too long
elements = {'H': 1.00794, 'He': 4.002602, 'Li': 6.941, 'Be': 9.012182, 'B': 10.811, 'C': 12.0107, 'N': 14.0067,
'O': 15.9994, 'F': 18.9984032, 'Ne': 20.1797, 'Na': 22.98976928, 'Mg': 24.305, 'Al': 26.9815386,
'Si': 28.0855, 'P': 30.973762, 'S': 32.065, 'Cl': 35.453, 'Ar': 39.948, 'K': 39.0983, 'Ca': 40.078,
'Sc': 44.955912, 'Ti': 47.867, 'V': 50.9415, 'Cr': 51.9961, 'Mn': 54.938045,
'Fe': 55.845, 'Co': 58.933195, 'Ni': 58.6934, 'Cu': 63.546, 'Zn': 65.409, 'Ga': 69.723, 'Ge': 72.64,
'As': 74.9216, 'Se': 78.96, 'Br': 79.904, 'Kr': 83.798, 'Rb': 85.4678, 'Sr': 87.62, 'Y': 88.90585,
'Zr': 91.224, 'Nb': 92.90638, 'Mo': 95.94, 'Tc': 98.9063, 'Ru': 101.07, 'Rh': 102.9055, 'Pd': 106.42,
'Ag': 107.8682, 'Cd': 112.411, 'In': 114.818, 'Sn': 118.71, 'Sb': 121.760, 'Te': 127.6,
'I': 126.90447, 'Xe': 131.293, 'Cs': 132.9054519, 'Ba': 137.327, 'La': 138.90547, 'Ce': 140.116,
'Pr': 140.90465, 'Nd': 144.242, 'Pm': 146.9151, 'Sm': 150.36, 'Eu': 151.964, 'Gd': 157.25,
'Tb': 158.92535, 'Dy': 162.5, 'Ho': 164.93032, 'Er': 167.259, 'Tm': 168.93421, 'Yb': 173.04,
'Lu': 174.967, 'Hf': 178.49, 'Ta': 180.9479, 'W': 183.84, 'Re': 186.207, 'Os': 190.23, 'Ir': 192.217,
'Pt': 195.084, 'Au': 196.966569, 'Hg': 200.59, 'Tl': 204.3833, 'Pb': 207.2, 'Bi': 208.9804,
'Po': 208.9824, 'At': 209.9871, 'Rn': 222.0176, 'Fr': 223.0197, 'Ra': 226.0254, 'Ac': 227.0278,
'Th': 232.03806, 'Pa': 231.03588, 'U': 238.02891, 'Np': 237.0482, 'Pu': 244.0642, 'Am': 243.0614,
'Cm': 247.0703, 'Bk': 247.0703, 'Cf': 251.0796, 'Es': 252.0829, 'Fm': 257.0951, 'Md': 258.0951,
'No': 259.1009, 'Lr': 262, 'Rf': 267, 'Db': 268, 'Sg': 271, 'Bh': 270, 'Hs': 269, 'Mt': 278,
'Ds': 281, 'Rg': 281, 'Cn': 285, 'Nh': 284, 'Fl': 289, 'Mc': 289, 'Lv': 292, 'Ts': 294, 'Og': 294}
print("Molecular Mass Calculator")
print("Supported input")
print("an element on its own e.g C")
print("an element with two letters e.g Cl")
print("a compound e.g CH4")
print("condensed formula e.g CH3(CH2)8CH3 instead of C10H22)")
formula = input("Enter in chemical formula: ")
sFormula = formula
print("Formula Entered: ", sFormula) # Self explannatory, prints out what user has entered
print("Elements: ")
# Search data inside
myRegEx = re.compile(r"(\()(\w*)(\))(\d*)",re.I) # in raw string, match whatever contains brackets, characters (i.e. letters a-z, A-Z), numbers from 0-9 and ignore case (re.I)
myMatches = myRegEx.findall(sFormula)
while myMatches: #start of while loop
myMatches = myRegEx.findall(sFormula)
for match in myMatches:
print (match[1], match[3])
count = match[3]
text =""
if (count == ""):
count = 1
else:
count = int(match[3])
while (count >= 1):
text = text + match[1]
count -= 1
print(text)
sFormula = sFormula.replace('(' + match[1] + ')' + match[3], text)
print("Replaced formula: ",sFormula)
# This pattern object is used to search a pattern (i.e. element symbols).
# TODO: Finish adding all elements to re.compile (DONE)
myRegEx = re.compile("(C[lanroudsemf]?|O[gs]?|N[heaibdposh]?|S[icernbmg]?|P[drmtboau]?|H[eofgas]?|A[lrsgutcm]|B[eraik]?|D[ys]|E[urs]|F[lerm]?|G[aed]|I[nr]?|Kr?|L[iaur]|M[gnodtc]|R[buhenfga]|T[icsebmalh]|U|V|W|Xe|Yb?|Z[nr])(\d*)")
myMatches = myRegEx.findall(sFormula) # Find the match of what elements appear in "sFormula" to myRegEx
molecularFormula =""
mm = 0
text =""
# This for statement is used to
for match in myMatches:
symbol = match[0] # Search for symbols in position 0 of match
number = match[1] # Search for numbers in position 1 of match
print(symbol,number)
if (number == ""): # If no number is present with the symbol in the chemical formula (Such as "Cl" on its own)
number = 1 # Multiply with 1 (i.e. for the molecular mass)
else:
number = int(match[1]) # Converts the string match[1] into an integer
mm = mm + float(elements[symbol])*number # Calculate molecular mass by adding on the molecular mass of elements[symbol]*number to variable mm in for loop until there is no elements left
while (number >=1):
molecularFormula = molecularFormula + symbol
number -= 1
print(f"{molecularFormula}")
print(f"The molecular mass of {formula} is {str(mm)}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment