常用正则库(1)-正则匹配化学元素计算分子质量
本文最后更新于 477 天前,其中的信息可能已经有所发展或是发生改变。
老大的帖子

想了想,实在是没有办法把这个文章名字缩短些,好吧,妈妈告诉我标题一定要长!第二次发这个图片,老梗了········

回到主题,最近喀什了一个正则的练手,因为看到NOIP上有一个题目,让用文本处理的方式计算CuSO4.H2O的相对分子质量,当时就想到正则,于是就动手试试,没想到用正则还不是那么容易,写了有一段时间,才算比较完整了。

但是我这个没有与题目相符,因为不能计算结晶,但是可以支持分子式中的括号缩写,不过大家想,如果有结晶,用”.”分割字符串迭代乘数字相加即可,这个如果有时间,我后面会加上来的。

采用一个字典记录相应的原子质量,这个也是综合了很多人给出的,然后采用正则的方式分离出来的,如果有需要就拿去吧。

以下是代码:

    def stoichiometry(string_var):
        # Author:[email protected]
        # Using regx in Python to calculate stoichiometry
        # 懂英文的人请无视我的英语······
        eleDict = {'Ce': 140.116, 'Th': 232.03806, 'Ne': 20.1797, 'Tl': 204.3833, 'Se': 78.96, 'As': 74.9216, 'Pr': 140.90765, 'Bi': 208.9804, 'Gd': 157.25,
        'Sc': 44.955912, 'Rn': 222.0176, 'Ru': 101.07, 'Ba': 137.327, 'K': 39.0983, 'S': 32.065, 'Mo': 95.94, 'W': 183.84, 'Ni': 58.6934, 'Ge': 72.64,
        'Ga': 69.723, 'Eu': 151.964, 'F': 18.9984032, 'Tc': 97.9072, 'Sm': 150.36, 'Ho': 164.93032, 'In': 114.818, 'Ir': 192.217, 'Tb': 158.92535,
        'Ti': 47.867, 'Ta': 180.94788, 'Xe': 131.293, 'Sn': 118.71, 'Cs': 132.9054519, 'Li': 6.941, 'Cr': 51.9961, 'Zr': 91.224, 'Al': 26.9815386,
        'Dy': 162.5, 'Sb': 121.76, 'Nd': 144.242, 'Br': 79.904, 'Er': 167.259, 'Sr': 87.62, 'C': 12.017, 'Ar': 39.948, 'He': 4.002602, 'Zn': 65.409,
        'Cl': 35.453, 'Rb': 85.4678, 'At': 209.9871, 'Cd': 112.411, 'Fe': 55.845, 'U': 238.02891, 'Kr': 83.798, 'B': 10.811, 'Mn': 54.938045,
        'H': 1.00794, 'La': 138.90547, 'Ag': 107.8682, 'Hf': 178.49, 'Yb': 173.04, 'Cu': 63.546, 'Au': 196.966569, 'Hg': 200.59, 'Pb': 207.2,
        'Na': 22.98976928, 'Tm': 168.93421, 'O': 15.9994, 'Ca': 40.078, 'P': 30.973762, 'Rh': 102.9055, 'I': 126.90447, 'Po': 208.9824,
        'Mg': 24.305, 'V': 50.9415, 'Re': 186.207, 'Pd': 106.42, 'Os': 190.23, 'Pa': 231.03588, 'Te': 127.6, 'Si': 28.0855, 'Y': 88.90585,
        'Pt': 195.084, 'Lu': 174.967, 'N': 14.0067, 'Be': 9.012182, 'Nb': 92.90638, 'Co': 58.933195}
        if not isinstance(string_var,str):
            raise TypeError("Argument must be a string, not %s" % (str(type(string_var)))[8:-2])
        if len(string_var) == 0:
            return False
        regx = r"([A-Z][a-z]?)([1-9]\d?)?"
        regx = re.compile(regx)
        Element = []
        if "(" in string_var:
            if ")" in string_var:
                regx_In = r"\((.*?)\)([1-9]\d?)?"
                regx_In = re.compile(regx_In)
                in_Element = regx_In.findall(string_var)
                for ele in in_Element:
                    if ele[1] == "":
                        ele = (ele[0],"1")
                    temp = regx.findall(ele[0])
                    for temp_ele in temp:
                        temp_ele = list(temp_ele)
                        temp_ele.append(ele[1])
                        Element.append(tuple(temp_ele))
                num = 0
                for ele in Element:
                    if ele[1] == "":
                        ele = (ele[0],int(ele[2]))
                    else:
                        ele = (ele[0],int(ele[1])*int(ele[2]))
                    Element[num] = ele
                    num += 1
            else:
                return False
        string_var = re.sub(r"\(.*?\)([1-9]\d?)?","",string_var)
        out_Element = regx.findall(string_var)
        for ele in out_Element:
            ele = list(ele)
            if ele[1] == "":
                ele[1] = 1
            else:
                ele[1] = int(ele[1])
            Element.append(tuple(ele))
        Element_dict,mass = {},0
        for ele in Element:
            if ele[0] in Element_dict.keys():
                Element_dict[ele[0]] += ele[1]
            else:
                Element_dict[ele[0]] = ele[1]
        for key in Element_dict:
            if key in eleDict.keys():
                mass += eleDict[key] * Element_dict[key]
            else:
                raise ValueError("Could not found any Element named %s" % "'"+str(key)+"'")
        return Element_dict,round(mass,2)

函数说明:stoichiometry(stoichiometry_expression)

返回:tuple(dict{element:num},mass_all)

# 栗子:(Example):
print (reusing.stoichiometry("Ca10(PO4)6(OH)2"))
# 羟基磷酸钙
print (reusing.stoichiometry("C21H30ClNO3"))
# 我也不知道是啥······胡按的

图片:

正则库_化学

其实我也不知道说明写的啥 ^_*,大家自己用一下就好了,如果有错误请及时给我发邮件或留言通知,谢谢!

最近很累,一直没时间更帖子,刚从外地回来,更上两篇帖子。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇