Created
May 2, 2020 06:38
-
-
Save zamiur/f1021e4f67f0e090f32bbedb66575cdb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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