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