0

我需要一个 python 中的正则表达式,它能够匹配不同的名称格式,就像我有 4 种不同的名称格式为同一个人一样。

R. K. Goyal Raj K. Goyal Raj Kumar Goyal R. Goyal

从数千个列表中的单个正则表达式中获取所有这些名称的正则表达式是什么。

PS:我的列表有数千个这样的名称,所以我需要一些通用的解决方案,以便我可以将这些名称组合在一起。在上面的示例中,R 和 Goyal 可用于编写 RE。

谢谢

4

3 回答 3

1

"R(\.|aj)? (K(\.|umar)? )?Goyal"只会匹配这四种情况。您也可以为其他名称修改它。

于 2013-05-15T15:40:05.803 回答
1

我可能误解了这个问题,但我正在设想一个解决方案,您可以遍历名称列表并为每个名称动态构造一个新的正则表达式,然后将所有这些正则表达式存储在字典中以供以后使用:

import re

names = [ 'John Kelly Smith', 'Billy Bob Jones', 'Joe James', 'Kim Smith' ]
regexps={}
for name in names:
    elements=name.split()
    if len(elements) == 3:
        pattern = '(%s(\.|%s)?)?(\ )?(%s(\.|%s)? )?%s$' % (elements[0][0], \
                                                           elements[0][1:], \
                                                           elements[1][0], \
                                                           elements[1][1:], \
                                                           elements[2])
    elif len(elements) == 2:
        pattern = '%s(\.|%s)? %s$' % (elements[0][0], \
                                      elements[0][1:], \
                                      elements[1])
    else:
        continue

    regexps[name]=re.compile(pattern)

jksmith_regexp = regexps['John Kelly Smith']
print bool(jksmith_regexp.match('K. Smith'))
print bool(jksmith_regexp.match('John Smith'))
print bool(jksmith_regexp.match('John K. Smith'))
print bool(jksmith_regexp.match('J. Smith'))

通过这种方式,您可以轻松跟踪哪个正则表达式会在您的文本中找到哪个名称。

你也可以做这样的方便的事情:

if( sum([bool(reg.match('K. Smith')) for reg in regexps.values()]) > 1 ):
    print "This string matches multiple names!"

您在哪里检查文本中的某些名称是否模棱两可。

于 2013-05-15T16:15:58.147 回答
0

公平警告:我有一段时间没有使用 Python,所以我不会给你具体的函数名称。

如果您正在寻找适用于任何可能名称的通用解决方案,您将不得不动态构建它。

假设第一个名字总是不会被删除的(我知道一些人的名字遵循“约翰大卫史密斯”的格式并由大卫去)你应该能够抓住字符串的第一个字母并将其称为第一个首字母。

接下来,您需要获取姓氏 - 如果您没有 Jr's 或 Sr's 等,您可以只取最后一个单词(找到最后一个出现的 ' ',然后取其后的所有内容)。

从那里,"<firstInitial>* <lastName>"是一个好的开始。"<firstInitial>(\.|<restOfFirstName>)* <lastName>"如果您还费心获取整个名字,则可以使用joon 的答案进一步减少误报匹配。

如果您想变得真正花哨,检测中间名的存在可以进一步减少误报。

于 2013-05-15T15:52:32.380 回答