Python:关于解析人类可读tex的问题

2024-06-17 18:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析人类可读的科学文本,主要是在化学领域。我感兴趣的是将文本分解成一系列单词、科学术语(下面将详细介绍)和标点符号。在

例如,我希望文本“hello,world.”分成4个标记:1)“hello”;2)逗号;3)“world”和4)句点。请注意,空间不需要专门的标记。在

像“吡啶-4”这样的化学术语与“甲基-4”有关。任何学过化学的人都知道这些公式可能很长,可能包含数字、破折号和逗号,有时甚至还有圆括号,但我认为可以肯定的是,这些可爱的表达式不能包含空格。另外,我认为这些表达式必须以数字开头。我希望每一个这样的表达出来作为一个单一的象征。在

今天,我使用手动解析来查找以数字开头并以空格、换行符或标点符号后跟空格或换行符结尾的“块”文本。在

我想知道是否有一个聪明的解决方案(regex或其他)可以用来根据上述规范标记文本。我在Python中工作,但这可能与语言无关。在

输入示例(显然忽略内容…):

“你好。1-甲基-4-苯基吡啶是极坏的。但是,1-甲基-4-苯基-1,2,3,6-四氢吡啶更差。”

示例输出(每个令牌在其自己的行中):

Hello
.
1-methyl-4-phenylpyridinium
is
ultra
-
bad
.
However
,
1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine
is
worse
.

Tags: 标记文本示例helloworld表达式数字科学
3条回答

可能会有一个正则表达式来解析您想要的内容,但我不认为它是非常可读/可维护的。我的建议是使用类似ANTLR的解析器生成器。我认为你必须抛弃这样一个观念:你可以把化学描述变成一个单一的符号,太复杂了。ANTLR甚至有一个调试器,这样你就可以知道为什么它没有解析你认为应该解析的东西,我认为使用regexp是不可能的。在

谨致问候

塞巴斯蒂安

这将解决您当前的示例。它可以调整为更大的数据集。在

import re
splitterForIndexing = re.compile(r"(?:[a-zA-Z0-9\-,]+[a-zA-Z0-9\-])|(?:[,.])")
source = "Hello. 1-methyl-4-phenylpyridinium is ultra-bad. However, 1-methyl-4-phenyl-1,2,3,6-tetrahydropyridine is worse."
print "\n".join( splitterForIndexing.findall(source))

结果是:

^{pr2}$

对不起,没看到非常糟糕。如果有必要把这些词分开。。在

import re
splitterForIndexing = re.compile(r"(?:[a-zA-Z]+)|(?:[a-zA-Z0-9][a-zA-Z0-9\-(),]+[a-zA-Z0-9\-()])|(?:[,.-])")
source = "Hello. 1-methyl-4-phenylpyridinium is ultra-bad. However, 1-methyl-4-phenyl-1,(2,3),6-tetrahydropyridine is worse."
print "\n".join( splitterForIndexing.findall(source))

给出:

"""
Hello
.
1-methyl-4-phenylpyridinium
is
ultra
-
bad
.
However
,
1-methyl-4-phenyl-1,(2,3),6-tetrahydropyridine
is
worse
.
"""

我同意Sebastiaan Megens的观点,即regex解决方案可能是可能的,但可能不是很可读或可维护的,特别是如果您还不擅长正则表达式。如果您坚持使用Python,我建议使用pyparsing module(我认为这是一个不错的选择)。在

如果您的解析需要增长或改变,额外的可维护性将非常有用。(我相信很多人会说“当”而不是“如果”!例如,有人已经评论说,你可能需要一个更复杂的概念,什么是需要允许作为一个化学名称。也许你的需求在你选择工具之前就已经改变了!)在

相关问题 更多 >