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

时间:2016-03-16 05:43:04

标签: python regex string list substitution

我试图从名称列表中删除中间名首字母,以便它们都符合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']

我错过了什么?我觉得我真的很接近我的解决方案,但它暗指我。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

当您使用re.match时,您正在使用re.search

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

需要注意的另一点是:当您使用编译的正则表达式(使用re.match制作)时,不需要使用re.searchre.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(因为该变量仅代表一个名称)。