2017-08-02 40 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