2011-09-07 71 views
4

我需要使用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庫?

+0

「DSL」是一個通用術語。哪個**特定** DSL是這個?什麼是域名?有沒有適用的標準?當您搜索「Parse * D * Python」(其中* D *是DSL的適用標準定義)時,您得到了什麼? –

+1

這是一個在俄羅斯非常流行的程序的字典文件格式。這是他們自己的格式,文件有'.dsl'消失。所有的信息都是俄文的,所以我不認爲在這裏發佈鏈接到描述是個好主意。 – ovgolovin

+0

我認爲可能有一些通用模塊來解析帶有標籤的文本文件。所以我決定在這裏問。 – ovgolovin

回答

1

「某些引擎允許基於嵌套標籤結構創建樹」。

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

您可以快速,輕鬆地定義語法爲一組詞法規則和一些語法產生。

如果你不喜歡那個,這裏有一個替代品列表。

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

+0

謝謝!至少我現在知道它太複雜了。我想我會堅持使用RegExps來提取我所需要的一些部分。但是,當他們需要使用標籤解析標記文本文件時,其他人可能會尋找的東西。 – ovgolovin

+0

「我認爲我會堅持RegExps」。通常這隻會使一個問題成爲兩個問題。在嘗試正則表達式之前,您需要先看看PLY這種東西。 –

1

將RegExp用於此目的以外的其他用途會給人心痛和痛苦。

如果你堅持使用正則表達式(不推薦),查看由「.dsl」關於XML

使用HERE如果方法你指的是ABBRY或Lingvo的字典格式,你可能想看看stardict.它可以讀取ABBRY dsl格式。

+0

是的,它是Lingvo格式。我需要從DSL文件中爲自己提取一些數據,並且我想要最有效地完成它。 – ovgolovin

+0

有幾個項目將Lingo轉換爲其他項目。先看那裏。定義YACC/LEX語法將是第二選擇。 [S.洛特給了幾個鏈接](http://stackoverflow.com/questions/7339446/parsing-a-text-file-with-a-special-markup/7339662#7339662)。避免使用正則表達式,除非你只是試圖分離完整的部分,我想。 – dawg

+0

感謝您的回答。我選擇了@ S.Lott的答案,因爲我認爲這對那些將要面對其他需要解析標籤的其他標記文本格式的人會很有用。你的答案也很有幫助! – ovgolovin