python - 拆分名称列表,其中两个名字可能有共同的姓氏

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

最佳答案

作为第一次匹配的更有效方式,您可以使用 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) 如果 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')]

关于python - 拆分名称列表,其中两个名字可能有共同的姓氏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867935/

相关文章:

python - 对于 : not returning all lines 中的行

html - mailto in href : should I add rel noopener, noreferrer?

html - 为什么父 Div 会被链接?

java - 计算 N 变量多项式字符串

python - pandas 对重复值进行排名

python - 如何连接 Pandas 中包含列表(系列)的两列

python - 无法删除/取消链接到 python 和 Windows 中目录的符号链接(symbolic link)

html - 如何使文本在 div 元素中居中?

regex - Delphi XE7 + TRegEx如何正确?

javascript - 正则表达式检测奇数个连续引号