gpt4 book ai didi

java - 解析化学式

转载 作者:IT老高 更新时间:2023-10-28 20:42:55 27 4
gpt4 key购买 nike

我正在尝试为一个应用程序编写一个方法,该应用程序采用像“CH3COOH”这样的化学公式并返回某种包含其符号的集合。

CH3COOH 将返回 [C,H,H,H,C,O,O,H]

我已经有了一些可以工作的东西,但它非常复杂,并且使用了很多代码以及很多嵌套的 if-else 结构和循环。

有没有办法通过使用某种带有 String.split 的正则表达式或其他一些出色的简单代码来做到这一点?

最佳答案

我编写了几篇关于如何解析分子式的系列文章,包括更复杂的公式,例如 C6H2(NO2)3CH3。

最近的是我在 PyCon2010 上的演讲“PLY and PyParsing”,我使用分子式评估器作为示例问题比较了这两个 Python 解析系统。甚至还有一个 video of my presentation .

演示文稿基于 three-part series of articles我确实使用 ANTLR 开发了一个分子式解析器。在 part 3我将 ANTLR 解决方案与手写的正则表达式解析器以及 PLY 和 PyParsing 中的解决方案进行了比较。

regexp 和 PLY 解决方案最初是在 two-part series 中开发的。关于用 Python 编写解析器的两种方法。

正则表达式解决方案和基础 ANTLR/PLY/PyParsing 解决方案,使用像 [A-Z][a-z]?\d* 这样的正则表达式来匹配公式中的术语。这就是@David M 的建议。

这是用 Python 解决的

import re

# element_name is: capital letter followed by optional lower-case
# count is: empty string (so the count is 1), or a set of digits
element_pat = re.compile("([A-Z][a-z]?)(\d*)")

all_elements = []
for (element_name, count) in element_pat.findall("CH3COOH"):
if count == "":
count = 1
else:
count = int(count)
all_elements.extend([element_name] * count)

print all_elements

当我运行它时(硬编码为使用乙酸,CH3COOH)我得到

['C', 'H', 'H', 'H', 'C', 'O', 'O', 'H']

请注意,这段代码假定分子式是正确的。如果你给它“##$%^O2#$$#”之类的东西,那么它将忽略它不知道的字段并给出['O','O']。如果您不希望这样,那么您必须使其更加健壮。

如果您想支持更复杂的公式,例如 C6H2(NO2)3CH3,那么您需要了解一些有关树数据结构的知识,特别是(正如 @Roman 指出的那样)抽象语法树(通常称为 AST )。这太复杂了,无法进入这里,所以请参阅我的演讲和文章了解更多详细信息。

关于java - 解析化学式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2974362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com