正则表达式分离带后缀数字的国家名称问题排查
问题分析与解决方案
问题原因
你的正则([a-zA-Z]*)(\d*)导致第一分组捕获空值、Country列变空,主要有两个核心原因:
[a-zA-Z]*仅匹配大小写字母,若国家名称包含空格、连字符等非字母字符,正则会在这些字符前匹配0次字母,直接导致第一分组为空。*是允许匹配0次的量词,当字符串存在数字开头的情况(哪怕是个别数据),或者正则引擎的匹配优先级优先选择空的字母分组,也会出现第一分组为空的问题。
修正方案
改用更通用的正则匹配逻辑,结合pandas的字符串方法正确提取分组内容:
步骤1:调整正则表达式
用(\D*)(\d*)替代原正则,其中:
\D*匹配所有非数字字符,覆盖字母、空格、特殊字符等国家名称常见格式\d*匹配所有数字后缀
步骤2:正确编写处理函数
import pandas as pd def new_name2(df): # 提取非数字前缀和数字后缀两个分组 extracted = df['Country'].str.extract(r'(\D*)(\d*)') # 将清洗后的国家名称赋值回原列,去除可能的冗余空格 df['Country'] = extracted[0].str.strip() # 可选:新增列存储数字后缀,空值替换为pd.NA df['Country_Suffix'] = extracted[1].replace('', pd.NA) return df
测试示例
# 构造测试数据 test_df = pd.DataFrame({ 'Country': ['France6', 'Germany', 'Japan12', 'South Korea8', 'Brazil'] }) # 执行函数 cleaned_df = new_name2(test_df) print(cleaned_df)
运行结果:
Country Country_Suffix 0 France 6 1 Germany <NA> 2 Japan 12 3 South Korea 8 4 Brazil <NA>
内容的提问来源于stack exchange,提问作者Hugo_DH
相关产品推荐
相关产品推荐

