2016-05-17 39 views
1

我一直在思考這個問題一段時間,我似乎無法找到解決方案。解析未知長度Unicode名稱

我正在使用pyparsing來解析包含事件摘要的文本文件。每個文本文件都包含許多事件。每個事件的標題信息幾行後,列出多個人和數據對他們來說,格式如下:

字整數:用戶名(整數字字字)

  1. 是靜態的並且總是相同
  2. 整數是任何詮釋
  3. 用戶名可以是任何Unicode字符,包括符號,並能還包括空格

我似乎無法建立一個可以處理所有這些可能性的語法。解析奇怪的unicode字符以及空格/符號時,它會陷入困境。下面的例子3是難倒我的東西。

實例:

你好1:-fred,123(100你好堆棧溢出)

你好2:我的名字是布倫特(250你好堆棧溢出)

你好3:AAA + OOO (0你好堆棧溢出)

任何人有任何提示嗎?

編輯:

感謝您的響應。這就像一種魅力,但是當我轉到我的文本文件的下一部分時,我又陷入了同樣的問題。不知道我是否應該開始一個新的問題,或只是添加到這一個。

我現在試圖解析以下多種線路:

用戶名:動作名稱動作細節 用戶名行動

例子:

brent morrow: add 10 to 20 

brent:morrow: walks 

äää + óóó: stands 

brent morrow has returned 

所有動作的名稱和行動細節是靜態的和已知的。

因此,我遇到了一個問題,我無法跳過超出用戶名的文本,因爲它可能是許多不同操作之一。它最終只是打印整個文本文件(或至少它的一個重要部分)。

我絕對難住。基本上,我試圖找出一種方法來向前看,找到如下:

冒號+動作名稱+動作細節

空格+行動

...和然後在所有的字符(用戶名)之前。但是action-name/action-details/action可以是預定義操作列表中的許多操作之一。負面看起來,〜,看起來很有希望,但我似乎無法找到解決方案來接受用戶名的所有Unicode字符。

正在解析的文本文件來自我的控制之外的第三方,因此無法找到更具體地構造源文件的方式。

回答

2

嘗試使用SkipTo(代碼使用了最新的2.1.4 pyparsing功能runtests):

# -*- coding: utf-8 -*- 

tests = """ 
    # a regular line 
    hello 1: -fred,123 (100 hello stack overflow) 

    # a username with spaces 
    hello 2: my name is brent (250 hello stack overflow) 

    # a username with non-ASCII 
    hello 3: äää + óóó (0 hello stack overflow) 
""" 

from pyparsing import * 

COLON,LPAR,RPAR = map(Suppress, ":()") 
integer = pyparsing_common.integer 

leading = "hello" + integer + COLON 
trailing = LPAR + integer + "hello" + "stack" + "overflow" + RPAR 

strip = lambda t: t[0].strip() 
line = leading + SkipTo(trailing).setParseAction(strip) + trailing 

line.runTests(tests) 

給出:

# a regular line 
hello 1: -fred,123 (100 hello stack overflow) 
['hello', 1, '-fred,123', 100, 'hello', 'stack', 'overflow'] 

# a username with spaces 
hello 2: my name is brent (250 hello stack overflow) 
['hello', 2, 'my name is brent', 250, 'hello', 'stack', 'overflow'] 

# a username with non-ASCII 
hello 3: äää + óóó (0 hello stack overflow) 
['hello', 3, '\xe4\xe4\xe4 + \xf3\xf3\xf3', 0, 'hello', 'stack', 'overflow'] 

練習了OP:結果名稱添加到整數和用戶名,使更容易訪問分析的字段。

+0

感謝您的幫助。這就像一個魅力。感謝您指出結果名稱,這將非常有用。我將在實施此解決方案後立即添加另一個我遇到的問題。不知道我是否應該打開另一個問題,但它與這個問題有關,所以我現在就留在這裏。 –