2016-02-04 62 views
1

我有一個自定義腳本,我想從python中提取數據,但我能想到的唯一方法是取出已標記的位,然後在此示例中留下未標記的位,如「go up」「go down」。如何在python中多次解析字符串?

string_a = [start]go up[wait time=500]go down[p] 
string_b = @onclick go up[wait time=500]go down active="False" 

在試圖這樣做,所有我能夠做到的是提取標位,但我不能想出一個辦法來保存心不是標誌着數據!當我提取其他位時,它總是會丟失! 這是我用來提取它們的函數。爲了減少標記,我多次調用它,但是我不能選擇它們提取的順序!

class Parsers: 

    @staticmethod 
    def extract(line, filters='[]'): 
    #@retval list 
    substring=line[:] 
    contents=[] 
    for bracket in range(line.count(str(filters[0]))): 
     startend =[] 
     for f in filters: 
     now= substring.find(f) 
     startend.append(now) 
     contents.append(substring[startend[0]+1:startend[1]]) 
     substring=substring[startend[1]+1:] 
    return contents, substring 

順便說一句,即時調用它在這一刻是這樣的。我想我應該把命令放回到@首先,但我不想再打破它。

star_string, first = Parsers.extract(string_a, filters='* ') 
bracket_string, substring = Parsers.extract(string_a, filters='[]') 
at_string, final = Parsers.extract(substring, filters='@ ') 

請原諒我的壞蟒蛇,我學到了這一切,我自己,我仍然搞清楚這一點。

+1

這是Python,而不是Java - 不需要爲創建類創建類。如果你只需要一個'extract'函數,只需在modulevelvel中創建函數 - 不需要'staticmethod'。 – jsbueno

回答

0

你正在用上面的Python字符串方法做一些強大的謬誤 - 但如果你想要的是提取括號內的內容,並獲得字符串的剩餘部分,這將是一個正則表達式的東西(在Python中,該「再」模塊)

import re 
string_a = "[start]go up[wait time=500]go down[p]" 
expr = r"\[.*?\]" 
expr = re.compile(r"\[.*?\]") 
contents = expr.findall(string_a) 
substring = expr.sub("", string_a) 

這簡單地告訴正則表達式引擎以匹配文字[,不管字符是有(.*)到下面]?用來匹配下一個],和不是最後一個) - findall調用將所有此類匹配作爲字符串列表進行獲取,而sub調用將替換空字符串的所有匹配項。

爲了讓正則表達式更好,它們比自己的子編程語言少了Python。檢查他們的文檔:https://docs.python.org/2/library/re.html

儘管如此,一個簡單的方法來做你所做的是按字符檢查字符,並有一些變量來「知道」你在字符串中的位置(如果在一個標籤或不,例如) - 就像我們一次只能看一個字符一樣,我們會考慮這個問題。我會寫的代碼思考的Python 3.x的 - 如果你還在使用Python 2.x中,請嘗試這樣的東西之前,將您的字符串轉換爲Unicode對象:

def extract(line, filters='[]'): 
    substring = "" 
    contents = [] 
    inside_tag = False 
    partial_tag = "" 
    for char in line: 
     if char == filters[0] and not inside_tag: 
      inside_tag = True 
     elif char == filters[1] and inside_tag: 
      contents.append(partial_tag) 
      partial_tag = "" 
      inside_tag = False 
     elif inside_tag: 
      partial_tag += char 
     else: 
      substring += 1 
    if partial_tag: 
     print("Warning: unclosed tag '{}' ".format(partial_tag)) 
    return contents, substring 

認爲的沒有必要的複雜計算每個括號在哪一行中的位置,等等 - 你只需要把它們全部取出。

+1

TIL:malabarismo ==心理雜耍/雜技 –

+0

是的 - 英語是一種很好的語言來吞噬這些外來詞語。 – jsbueno

0

不知道我完全理解 - 你想要得到[stuff in brackets]everything else?如果你是剛剛解析平弦 - 沒有遞歸括號,在括號 - 你可以做

import re 

parse = re.compile(r"\[.*?\]|[^\[]+").findall 

然後

>>> parse('[start]go up[wait time=500]go down[p]') 
['[start]', 'go up', '[wait time=500]', 'go down', '[p]'] 

>>> parse('@onclick go up[wait time=500]go down active="False"') 
['@onclick go up', '[wait time=500]', 'go down active="False"'] 

正則表達式轉換爲「二方括號或任何之間的所有內容,但不得包括一個開放方括號「。

如果這不是你想要的 - 你想@word是一個單獨的塊? - 請顯示string_astring_b應該被解析爲!