用于在python中匹配不同名称格式的正则表达式

时间:2013-05-15 15:32:30

标签: regex python-2.7

我需要在python中使用一个能够匹配不同名称格式的正则表达式 我有4种不同的名字格式为同一个人。像

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

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

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

由于

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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!"

在哪里查看文本中的某些名称是否含糊不清。

答案 2 :(得分:0)

公平警告:我暂时没有使用过Python,所以我不会给你特定的函数名称。

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

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

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

从那里开始,"<firstInitial>* <lastName>"是一个好的开始。如果您懒得抓住整个名字,您可以使用"<firstInitial>(\.|<restOfFirstName>)* <lastName>"进一步减少误报,如joon的答案。

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