分割名称列表,其中可能是两个名字的共同姓氏

时间:2015-01-09 19:38:17

标签: python html regex python-2.7

在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只是替换字符串。

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分: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