我正在使用模板将非结构化文档解析为结构化表示(XML)以描述预期结果.一个简单的典型问题可能是字符串列表:
"Chapter 1"
"Section background"
"this is something"
"this is another"
"Section methods"
"take some xxx"
"do yyy"
"and some..."
"Chapter apparatus"
"we created..."
Run Code Online (Sandbox Code Playgroud)
我希望转变为:
<div role="CHAPTER" title="1">
<div role="SECTION" title="background">
<p>this is a paragraph...</p>
<p>this is another...</p>
</div>
<div role="SECTION" title="methods">
<p>take some xxx</p>
<p>do yyy</p>
<p>and some...</p>
</div>
</div>
<div role="CHAPTER" title="apparatus">
<div role="SECTION" title="???">
<p>we created...</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
标签CHAPTER和SECTION不存在于字符串中,而是从启发式正则表达式(例如" [Cc]hap(ter)?(\s\d+\.)?.*")生成,并应用于所有字符串.
预期的结果由"模板"描述,目前看起来像:
<template count="0," role="CHAPTER">
<regex>[Cc]hap(ter)?(\s+.*)</regex>
<template count="0," role="SECTION">
<regex>[Ss]ec(tion)?(\s+.*)</regex>
<template count="0," role="p">
<regex>.*</regex>
</template>
</template>
</template>
Run Code Online (Sandbox Code Playgroud)
(在某些情况下,计数可以是范围,例如2,4).
我知道这是一个非常困难的问题(SGML试图解决它的一部分)并且真正的文档不能完全符合这些模板,因此我准备部分解析并失去一些精确度和召回.
多年来,我一直使用自己的工作代码,适用于各种类型的文档,最高可达几兆字节.性能不是问题.我有不同的模板用于不同的文档类型(论文,日志文件,fortran输出等).一些文档具有嵌套结构(例如,如上所述),而其他文档更平坦但具有更多类型的标记.
我现在正在重构这个并且想知道:
编辑:@naspinski和一般.始终可以编写特定的脚本代码来解决特定问题.我想要一个通用的解决方案,因为我可能正在解析许多(甚至数百万)文档,其结构具有可靠的(但不是无限的)可变性.我希望解析文档的结构用XML表示,而不是脚本.我相信通过模板(声明性)而不是脚本添加新的解决方案会更容易.
编辑我几乎可以肯定我现在最好的方法是使用ANTLR.它是一个强大的工具,从我最初的探索可以解析行和行组.
我相当确定我正在寻找的答案就在 ANTLR ( http://www.antlr.org/ ) 中。这允许我编写以下形式的表达式:
document : (chapter)+;
chapter : 'Chapter ' DIGIT NEWLINE line+;
Run Code Online (Sandbox Code Playgroud)
等等。它还允许将代码嵌入到这些表达式中。