我正在尝试从杂志文章中提取所有名字和姓氏(我称之为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)
答案 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']