拆分两个名字可能有共同姓氏的名字列表

2024-10-02 08:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在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 ',
    ...]

这是指凯利·默罗和汤姆·默罗。有什么办法能让我和这个案子匹配吗?我有一个函数执行regex操作(调用重新拆分),所以我的想法是添加到这个函数中,首先检查是否存在这种情况。如果列表中有两个以上的名字,则显示为姓氏与两个名字成对出现。只有当列表中有两个(而且只有两个)名字并且他们共享一个姓氏时,才会出现这种情况。你知道吗

编辑

我喜欢“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只是替换字符串。你知道吗


Tags: andre名称列表情况名字lisaron
2条回答

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

([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

作为第一次匹配的更有效方法,您可以使用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文件,其中包含repeat the last element和名为from begin of the list to lastnames[:-1]的元素,因此您将拥有以下内容。请注意,此方法适用于最长的名称,如(Kelly and Tom and rose and sarah Murro):

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

相关问题 更多 >

    热门问题