2015-01-09 47 views
2

在Python中,我通过名字的大名单解析,一些看起来是这样的:拆分列表中可能有共同姓氏,首先两个名字

[u' Ron Iervolino, Trish Iervolino, Russ Middleton, and Lisa Middleton ', 
u' Barbara Loughlin, Dr. Gerald Loughlin, and Debbie Gelston ', 
u' Julianne Michelle 
    ... '] 

我能使用这些分割成单独的名称这样的:

re.split('(([A-Z]\.?\s?)*([A-Z][a-z]+\.?\s?)+([A-Z]\.?\s?[a-z]*)*)', line)[1::5] 

例如,如果我称这上面的采样数据的第一位置时,它返回:

[u'Ron Iervolino', u'Trish Iervolino', u'Russ Middleton', u'Lisa Middleton '] 

很酷。这适用于很多情况。我遇到的问题是,有一些情况下,其中姓名的形式为:

[ ..., 
u' Kelly and Tom Murro ', 
    ...] 

这是指凯利Murro和汤姆·默罗两者。关于如何指示我匹配此特定情况的任何想法?我有一个执行正则表达式操作的函数(调用re.split),所以我的想法是添加到这个函数中,并检查该事件是否先存在。如果列表中有两个以上的名称,则显示为姓名与两个名字都配对。这似乎只有在列表中同时存在两个(且仅有两个)名称并且它们共用一个姓氏时才会发生。

EDIT

我喜欢的 “阿尔法喝彩” 溶液的简单性。为了理解发生了什么,我搞砸了Regex101网站演示,并让它生成了一些代码。这段代码似乎没有做任何事情,也许我的大脑由于盯着这么久而融化了。有什么建议么?

import re 
p = re.compile(ur'([A-Z]\w+\s+[A-Z]\w+)|([A-Z]\w+)(?=\s+and\s+[A-Z]\w+\s+([A-Z]\w+))', re.MULTILINE) 
test_str = u"Russ Middleton and Lisa Murro\nRon Iervolino, Trish and Russ Middleton, and Lisa Middleton \nRon Iervolino, Kelly and Tom Murro\nRon Iervolino, Trish and Russ Middleton and Lisa Middleton " 
subst = u"$1$2 $3" 

result = re.sub(p, subst, test_str) 

变量result只是替换字符串。

+0

处理这个问题的防弹方法是编写一个简单的解析器。 – 2015-01-09 19:56:39

回答

1

至于你的第一场比赛更有效的方式,你可以使用str.split()(如果您的字符串已经被切与,):

>>> s=u' Ron Iervolino, Trish Iervolino, Russ Middleton, and Lisa Middleton ' 
>>> [i.split('and')[1] if i.strip().startswith('and') else i for i in s.split(',')] 
[u' Ron Iervolino', u' Trish Iervolino', u' Russ Middleton', u' Lisa Middleton '] 

并找到u' Kelly and Tom Murro '的名字,你可以使用以下命令:

l=[] 
s=u' Ron Iervolino, Trish Iervolino, Russ Middleton, and Lisa Middleton ,Kelly and Tom Murro' 
import re 
for i in s.split(','): 
    i=i.strip() 
    if i.startswith('and') : 
     l.append(i.split('and')[1]) 
    elif not i.endswith('and') and 'and' in i : 
     names=[i for i in re.split(r'and| ',i) if i] 
     for t in zip(names[:-1],[names[-1] for i in range(len(names)-1)]): 
      l.append(' '.join(t)) 
    else: 
     l.append(i) 

print l 
[u'Ron Iervolino', u'Trish Iervolino', u'Russ Middleton', u' Lisa Middleton', u'Kelly Murro', u'Tom Murro'] 

当你与像u' Kelly and Tom Murro '首先你把它拆分为名称与[i for i in re.split(r'and| ',i) if i]列表,基于'and'拆分串串遇到,space因此您将有[u'Kelly', u'Tom', u'Murro']。那么,你想要的名称如下:

u'Kelly Murro' 
u'Tom Murro' 

您可以创建重复一个zip文件的最后一个元素,并命名,从开始列表的持续names[:-1]所以你将有以下。注意,像最长的名字这个配方工作(Kelly and Tom and rose and sarah Murro):

[(u'Kelly', u'Murro'), (u'Tom', u'Murro')] 
0

这应该给你一个想法,使用这种模式首先

([A-Z]\w+\s+[A-Z]\w+)|([A-Z]\w+)(?=\s+and\s+[A-Z]\w+\s+([A-Z]\w+)) 

和替换W/$1$2 $3
Demo

+0

我真的很喜欢它的简单性,谢谢!现在试图让实现工作。 – TheOriginalBMan 2015-01-09 20:44:50

相关问题