【问题标题】:Parsing a text file with a special markup使用特殊标记解析文本文件
【发布时间】:2011-11-12 10:59:42
【问题描述】:

我需要使用 Python 解析 DSL 文件。 DSL 文件是一个文本文件,其文本具有特殊标记,带有 ABBYY Lingvo 使用的标签。

看起来像:

activate
    [m0][b]ac·ti·vate[/b] {{id=000000367}} [c rosybrown]\[[/c][c darkslategray][b]activate[/b][/c] [c darkslategray][b]activates[/b][/c] [c darkslategray][b]activated[/b][/c] [c darkslategray][b]activating[/b][/c][c rosybrown]\][/c] [p]BrE[/p] [c darkgray] [/c][c darkcyan]\[ˈæktɪveɪt\][/c] [s]z_activate__gb_1.wav[/s] [p]NAmE[/p] [c darkgray] [/c][c darkcyan]\[ˈæktɪveɪt\][/c] [s]z_activate__us_1.wav[/s] [c orange] verb[/c] [c darkgray] [/c][b]{{cf}}\~ sth{{/cf}} [/b]
    [m1]{{d}}to make sth such as a device or chemical process start working{{/d}}
    [m2][ex][*]• [/*][/ex][ex][*]{{x}}The burglar alarm is activated by movement.{{/x}} [/*][/ex]
    [m2][ex][*]• [/*][/ex][c darkgray] [/c][ex][*]{{x}}The gene is activated by a specific protein.{{/x}} [/*][/ex]
    {{Derived Word}}[m3][c darkslategray][u]Derived Word:[/u][/c] ↑<<activation>>{{/Derived Word}}
    {{side_verb_forms}}[m3][c darkslategray][u]Verb forms:[/u][/c] [s]x_verb_forms_activate.jpg[/s]{{/side_verb_forms}}

现在我看到了使用regexps 解析此文件的唯一选项。但我怀疑它是否可以实现,因为这种格式的标签有一些层次结构,其中一些在其他的内部。

我不能使用特殊的 xmlhtml 解析器。它们非常适合创建文档的树形结构,但它们是为 htmlxml 的特殊标签设计的。

以这种格式解析文件的最佳方法是什么?是否有任何用于此目的的 Python 库?

【问题讨论】:

  • “DSL”是一个通用术语。这是哪个特定 DSL?什么是域?有适用的标准吗?当您在 Google 上搜索“解析 D Python”(其中 D 是适用于 DSL 的标准定义)时,您得到了什么?
  • 这是一个在俄罗斯非常流行的程序的字典文件格式。这是他们自己的格式,文件有.dsl extintion。所有信息都是俄文的,所以我认为在这里发布描述链接不是一个好主意。
  • 我认为可以有一些通用模块来解析带有标签的文本文件。所以我决定在这里问。
  • “带有标签的文本文件”?这太模糊了,没有任何意义。 JSON、LaTex、RTF 都是“带标签的文本文件”。没有“通用解析器”。您只需要使用 DSL 的适用标准的 name 来搜索解析器。如果用 Google 找不到,那么它不存在。没有神奇的“带有标签的文本”,因为它太开放、太模糊、太模糊。
  • @S.Lott 谢谢。我在谷歌上找不到任何东西。这是他们当地的标准。我认为它们可能是一些允许基于嵌套标签结构创建树的引擎(通过提供文本和标签列表(在这种情况下,大多数标签都在方括号中))。

标签: python parsing tags markup


【解决方案1】:

“一些允许基于嵌套标签结构创建树的引擎”。

http://www.dabeaz.com/ply/

您可以快速轻松地将语法定义为一组词汇规则和一些语法产生式。

如果你不喜欢那个,这里有一个替代列表。

http://wiki.python.org/moin/LanguageParsing

【讨论】:

  • 谢谢!至少我现在知道它太复杂了。我想我会坚持使用 RegExps 来仅提取我需要的一些部分。但是当其他人需要解析带有标签的标记文本文件时,他们可能会寻找您的分析器。
  • “我想我会坚持使用 RegExps”。通常这只会使一个问题变成两个问题。在尝试正则表达式之前,您需要查看 PLY 是否有这种情况。
【解决方案2】:

将正则表达式用于除琐碎用途之外的其他事情会让人心痛和痛苦。

如果您坚持使用正则表达式(不推荐),请查看在 XML 上使用的 HERE 方法

如果“.dsl”是指 ABBRY 或 Lingvo dict 格式,您可能需要查看 stardict. 它可以读取 ABBRY dsl 格式。

【讨论】:

  • 是的,它是 Lingvo 格式。我需要从 DSL 文件中为自己提取一些数据,并且我想以最有效的方式完成它。
  • 有几个项目可以将 Lingo 转换为其他东西。先看看那里。定义一个 YACC / LEX 语法将是第二个选择。 S.Lott gave a couple of links。除非你只是想把我想的完整部分分开,否则请避免使用正则表达式。
  • 感谢您的回答。我选择了@S.Lott 的答案,因为我认为这对于那些将面临其他带有需要解析的标签的标记文本格式的人很有用。你的回答也很有帮助!
  • 我需要从大约 3000 个单词卡片(带有关键词的卡片)中提取一些信息,将其添加到我用来学习英语单词的程序中。我想用复制粘贴的方法来做。但后来我决定使用 Python 而不是做机械工作并更好地学习 Python 是个好主意。
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2016-01-09
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多