改善我在python中的会员资格比较

时间:2018-11-09 17:54:53

标签: python

我正在尝试从杂志文章中提取所有名字和姓氏(我称之为example.txt)。我分为两个部分。

在第一部分中,我提取了一个包含两个单词的字符串,每个单词都以一个大写字母开头,中间有一个空格,然后使用regex进行此操作。我列出了所有这些字符串,并将其称为all_names。这给了我所有可能的名字,例如“巴拉克·奥巴马”,还有“总统”。

在第二部分中,我将字符串拆分并取每个名称的第一部分,假设“ Barack Obama”的“ Barack”,并且我想检查“ Barack”是否在我准备的名字列表中提前(我称之为first_names.txt)。如果存在匹配项,并且只有存在匹配项,则将其添加到一个新数组中,该数组应该仅具有与first_names.txt中的名称匹配的名称。

因此,从理论上讲,“巴拉克·奥巴马”(Barack Obama)进入了阵营,而“总统”(The President)则没有。不幸的是,“总统”的子字符串“ The”在诸如“ Matthew”和“ Katherine”的名字中找到,因此即使我不希望“总统”也进入数组。我的代码如下。有关如何解决此问题的任何建议?

import re 

text = open('example.txt').read()
first_names = open('first_names.txt').read()
regex = re.compile("[A-Z][a-z]+\s[A-Z][\w]*") 
all_names = regex.findall(text)
array = []

for name in all_names:
  first = name.split(" ")[0]
  if first in first_names:
    if name not in array:
      array.append(name)
print(array)

1 个答案:

答案 0 :(得分:1)

您可以拆分first_names并创建一个包含这些名称的set(假设文件中的名字用空格隔开):

first_names = set(open('first_names.txt').read().split())

然后if first in first_names将检查确切的名字是否在 O(1)时间内设置。这还将解决您排除“总统”的问题,因为"The" in first_names将返回False

这是一个简单的示例:

first_names_text = "Barack Matthew Katherine"

first_names = set(first_names_text.split())
all_names = ['Barack Obama', 'The President', 'Katherine Swift']

array = []
for name in all_names:
    first = name.split(" ")[0]
    if first in first_names:
        if name not in array:
            array.append(name)

print(array) 
# ['Barack Obama', 'Katherine Swift']