【发布时间】:2015-03-08 05:01:16
【问题描述】:
在 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 只是替换字符串。
【问题讨论】:
-
解决这个问题的防弹方法是编写一个简单的解析器。
标签: python html regex python-2.7