Python: 为什么这个正则表达式没有被替换?

Python: Why isn't this regular expression being substituted?

我试图从姓名列表中删除中间名的首字母,以便它们都符合 FirstName space LastName。所以我尝试编写一个正则表达式,然后我可以使用它来匹配具有中间首字母的列表项,然后将其替换为空 space.

这是我的代码:

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+')

因为我意识到无论如何我想至少保留其中一个 space,但仍然得到:

['John A Appleseed', 'Bonnie N Clyde', 'Joseph B Barthalomew', 'John Smith']

我错过了什么?我觉得我真的很接近我的解决方案,但这是在暗示我。如有任何帮助,我们将不胜感激。

你在应该使用 re.search 的时候使用了 re.match

According to the documentationmatch 仅匹配字符串的开头,而 search 匹配字符串中的任何位置。

另一件需要注意的事情:当你有编译的正则表达式(用re.compile制作)时,你不需要使用re.matchre.search。你can do this instead:

mid_name = re.compile(r'\s+[A-Z]\s+')
mid_name.search(name)

您也可能不需要在执行替换之前检查匹配项。这个额外的步骤是不必要的,因为实际上没有替换的替换会给你原始字符串。所以 compile 然后 sub (不要搜索)。


与您的问题无关:您可能需要考虑更改一些变量名称。

list 名称已用于表示 list 数据类型,因此您是 shadowing 该名称。您可能会考虑将 list 重命名为 names,并将 names 重命名为 name(因为该变量只代表一个名称)。