在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
只是替换字符串。
处理这个问题的防弹方法是编写一个简单的解析器。 – 2015-01-09 19:56:39