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 documentation、match
仅匹配字符串的开头,而 search
匹配字符串中的任何位置。
另一件需要注意的事情:当你有编译的正则表达式(用re.compile
制作)时,你不需要使用re.match
或re.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
(因为该变量只代表一个名称)。
我试图从姓名列表中删除中间名的首字母,以便它们都符合 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 documentation、match
仅匹配字符串的开头,而 search
匹配字符串中的任何位置。
另一件需要注意的事情:当你有编译的正则表达式(用re.compile
制作)时,你不需要使用re.match
或re.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
(因为该变量只代表一个名称)。