在 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 ',
...]
这是指 Kelly Murro 和 Tom Murro。关于如何指出我匹配这个特殊案例的任何想法?我有一个执行正则表达式操作的函数(调用 re.split),所以我的想法是添加到这个函数并检查是否首先存在该事件。如果列表中有两个以上的名字,则看起来好像姓氏与两个名字配对。这似乎只有在列表中同时有两个(并且只有两个)名字并且他们共享一个姓氏时才会发生。
编辑
我喜欢“alpha bravo”解决方案的简单性。为了了解发生了什么,我弄乱了 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
只是替换字符串。
最佳答案
作为第一次匹配的更有效方式,您可以使用 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) 如果 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')]
关于python - 拆分名称列表,其中两个名字可能有共同的姓氏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867935/