我试图从名称列表中删除中间名首字母,以便它们都符合FirstName空格LastName。所以我尝试编写一个正则表达式,然后我可以使用它来匹配具有中间首字母的列表项,然后用''空格替换它。
这是我的代码:
import re
list = ['John A Appleseed', 'Bonnie N Clyde', 'Joseph B Barthalomew', 'John Smith']
mid_name = re.compile(r'\s+[A-Z]\s+')
for idx, names in enumerate(list):
if re.match(mid_name, names) is not None:
list[idx] = mid_name.sub('', names)
print(list)
我的结果是:
['John A Appleseed', 'Bonnie N Clyde', 'Joseph B Barthalomew', 'John Smith']
然后我将正则表达式改为:
mid_name = re.compile(r'\w+\s+[A-Z]\s+\w+')
得到:
['', '', '', 'John Smith']
然后将正则表达式更改为:
mid_name = re.compile(r'[A-Z]\s+')
因为我意识到我想保留至少其中一个空格,但仍然得到:
['John A Appleseed', 'Bonnie N Clyde', 'Joseph B Barthalomew', 'John Smith']
我错过了什么?我觉得我真的很接近我的解决方案,但它暗指我。任何帮助将不胜感激。
答案 0 :(得分:1)
当您使用re.match
时,您正在使用re.search
。
According to the documentation,match
仅匹配字符串的开头,而search
匹配字符串中的任何位置。
需要注意的另一点是:当您使用编译的正则表达式(使用re.match
制作)时,不需要使用re.search
或re.compile
。你can do this instead:
mid_name = re.compile(r'\s+[A-Z]\s+')
mid_name.search(name)
在执行替换之前,您可能也不需要检查匹配项。这个额外的步骤是不必要的,因为实际上不替换的替换将为您提供原始字符串。所以编译然后再选择 sub (不要搜索)。
与您的问题无关:您可能需要考虑更改某些变量名称。
list
名称已用于表示list
数据类型,因此您shadowing表示该名称。您可以考虑将list
重命名为names
并将names
重命名为name
(因为该变量仅代表一个名称)。