2017-08-02 39 views
0

這裏是我的字符串:在Python正則表達式backrefrencing的稍微複雜的使用

string ='First: Michael, Second: Dennis, Third: Michael, \nAssists: Michael, Scoring: Michael, Rebounds: Peter, Steals: Dennis' 

這串持有代表的榮譽和他們的收件人許多項目。我試圖首先確定誰是 「第一」榮譽的獲得者,然後拉出涉及該收件人的所有其他項目。

因此,在這種情況下,我們檢查第一個收件人是誰(Michael),然後我們將所有與Michael有關的榮譽(以及Michael的名字)都拿出來。

所以結果應該是這樣的:

「第一:邁克爾,第三:邁克爾,助攻:邁克爾,得分:邁克爾

我試圖利用回用查找變通一起refrencing,但它有一個有些凌亂

import re 
string ='First: Michael, Second: Dennis, Third: Michael, \nAssists: Michael, Scoring: Michael, Rebounds: Peter, Steals: Dennis' 
re.findall('(?=First: (\w+)), (?=\w+: \w+,)|(\w+: \1,)+', string) 
+1

我真的覺得你應該把它分解成不同的線,並獲得比賽的方式。 –

回答

1

所以 - 這是一個不錯的「拼圖瑣事」,如果你想用正則表達式來做到這一點(我甚至可以給它一個嘗試後)做 - 但所有的allyou會有脆弱的代碼 - 如果你的輸入數據格式改變了一點,它就不會起作用,而且它會是維護噩夢。

現在,「穩定」的方式:挑選串 - 分裂它在「」 - 然後在分割每個段‘:’,條帶的每個組件,並創建一個Python字典出的那個。然後,它是平凡的使用字典解析表達式提取所需資料:

def get_first_accolade(text): 
    parts = text.split(",") 
    data = {} 
    for item in parts: 
     key, value = item.split(",") 
     data[key.strip()] = value.strip() 
    result = {key: value for key, value in data.items() if value == data["first"]} 
    return result 
+0

這不適合我。 'ValueError異常:需要比1點的值更unpack' –

+0

我明白了。我希望有一種優雅的方式來與RE的團隊方法之一做到這一點。 – Moondra

+0

它可能是可能的。它會覺得chalenging得到它,和樂趣,但我懷疑它可以被稱爲「優雅」 :-) – jsbueno