python - 如何使用正则表达式解析化学式?

标签 python regex string

我有一个列表模式:

patterns=['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al',
       'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn',
       'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb',
       'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In',
       'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm',
       'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta',
       'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At',
       'Rn']
我有带字符串的大数据框,例如:
str0='Mg0.97Fe0.03B2'
str1='Tl0.5Hg0.5Ba2Ca2Cu3O8'
我正在尝试这个:
keyss=list(filter(None,regex.split("[^a-zA-Z]*",somestring)))
values=list(filter(None,regex.split("[^0-9.0-9]*",somestring)))
有时,这有效:
str3='Hg0.75SrBa2Ca2Cu3O8'
keyss=list(filter(None,regex.split("[^a-zA-Z]*",str3)))
values=list(filter(None,regex.split("[^0-9.0-9]*",str3))
['Ba', 'Fe', 'Co', 'Mn', 'As']
['1', '1.832', '0.15', '0.018', '2']
但是,如果我有这样的字符串:
str3='Hg0.75SrBa2Ca2Cu3O8'
keyss=list(filter(None,regex.split("[^a-zA-Z]*",str3)))
values=list(filter(None,regex.split("[^0-9.0-9]*",str3)))
['Hg', 'SrBa', 'Ca', 'Cu', 'O']!=['Hg', 'Sr','Ba', 'Ca', 'Cu', 'O']
['0.75', '2', '2', '3', '8']!=['0.75', '1','2', '2', '3', '8']
或这个
str4='NbSn3'
keyss=list(filter(None,regex.split("[^a-zA-Z]*",str4)))
values=list(filter(None,regex.split("[^0-9.0-9]*",str4)))
['NbSn']!=['Nb','Sn']
['3']!=['1','3']
str4='Pb1.4Sr4Y1.2Ca0.8Cu4.6O'
...
我的代码工作不正常。我该如何解决?

最佳答案

我猜你从 patterns 开始很好然后放弃了可能没有帮助的想法(您可以在 pyparsing 语法中使用它)但确实有一种更简单的方法可以遵循您的后一个想法。
我建议你做这样的事情:

str3='Hg0.75SrBa2Ca2Cu3O8'
splitted = list(regex.split("([A-Z][a-z]*)",str3))
keyss = list(filter(lambda a: a[0].isupper() if a else False, splitted))
values = list(filter(lambda a: a[0].isdigit() if a else False, splitted))
print(keyss, values)

['Hg', 'Sr', 'Ba', 'Ca', 'Cu', 'O'] ['0.75', '2', '2', '3', '8']

关于python - 如何使用正则表达式解析化学式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65179646/

相关文章:

javascript - 如何捕获 AngularJS 输入字段中的模式错误?

Python正则表达式问题

asp.net - web.config 位置路径属性上的正则表达式(带参数)

string - 在编译时获取 `str` 的字节

python - Flask 在向自身发送 post 请求时挂起

python - Linux 和 Windows 之间的多处理输出不同 - 为什么?

python - 如何实现在 Qt Designer 中定义的信号/槽

php - 分解数字并用空格分隔

string - swift/解析 : incrementing strings

python - 名称错误 : name 'book' is not defined