在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
只是替换字符串。你知道吗
这应该给你一个想法,先用这个模式
替换为w/
$1$2 $3
Demo
作为第一次匹配的更有效方法,您可以使用
str.split()
(如果您的字符串已被,
分割):对于在
u' Kelly and 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']
。然后,您需要以下名称:您可以创建一个zip文件,其中包含repeat the last element和名为from begin of the list to last
names[:-1]
的元素,因此您将拥有以下内容。请注意,此方法适用于最长的名称,如(Kelly and Tom and rose and sarah Murro
):相关问题 更多 >
编程相关推荐