Pandas过滤特殊字符、数字字符串时保留词间空格的实现方法
问题根源
原有筛选代码使用的正则(?i)[a-z]+$仅支持匹配纯字母字符串,未将单词间的合法空格纳入允许的字符范围,导致带空格的正常地名被误过滤。
修正代码
替换正则规则,在仅允许字母的基础上,支持匹配单词间的单个分隔空格,同时仍然排除数字、特殊字符、首尾空格、连续空格等非法内容:
out = location[location.apply(lambda c: c.str.match(r'(?i)^[a-z]+(?: [a-z]+)*$')).all(1)]
规则说明
修正后的正则各部分作用:
(?i):开启不区分大小写匹配,兼容不同大小写格式的地名^:锚定字符串起始位置,避免字符串开头出现非法字符[a-z]+:匹配开头的1个及以上字母(?: [a-z]+)*:非捕获组,匹配0次或多次「单个空格+连续字母」组合,仅允许单词之间出现单个分隔空格$:锚定字符串结束位置,避免字符串结尾出现非法字符
匹配结果验证
针对给出的测试数据,筛选结果完全符合预期:
- 含数字的
AGNIN34、含特殊括号字符的(REYDON)被正常过滤 - 纯字母的
MARSCIANO、SIZIANO、APELDOORN、REYDON,以及带单词间空格的SANXIANG TOWN、NEWYORK CITY全部保留,和目标输出一致。
内容的提问来源于stack exchange,提问作者aeapen
相关产品推荐
相关产品推荐

