You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中检测含空格的字符串是否包含数字?

解决混合姓名与邮寄地址的分离问题

你用isalnum()行不通是因为它要求所有字符都是字母/数字,但地址里的空格、甚至逗号(比如"123 Main St, New York")都会让这个方法返回False,完全没法区分姓名和地址。

要解决这个问题,得抓住姓名和地址的特征差异来做判断,以下是两种实用方案:

方案1:基于特征规则判断

地址通常包含门牌号(数字)或街道后缀(st/ave/rd等),而姓名一般以纯字母为主(可能带空格、连字符、点,比如"Mary Ann"、"O'Connor"、"J. Smith")。可以写个自定义函数来识别:

def is_address(entry):
    # 规则1:包含数字(地址大概率有门牌号)
    if any(char.isdigit() for char in entry):
        return True
    # 规则2:包含常见街道后缀(忽略大小写)
    street_suffixes = {'st', 'ave', 'avenue', 'rd', 'road', 'blvd', 'boulevard', 'dr', 'drive', 'ln', 'lane'}
    for word in entry.lower().split():
        if word in street_suffixes:
            return True
    # 都不满足则判定为姓名
    return False

# 示例用法
mixed_list = ["John Doe", "123 Main St", "Jane O'Connor", "456 Oak Ave", "Robert J. Smith"]
names = [item for item in mixed_list if not is_address(item)]
addresses = [item for item in mixed_list if is_address(item)]

print("提取的姓名:", names)
print("提取的地址:", addresses)

方案2:正则表达式匹配地址模式

如果你的地址格式比较统一(比如门牌号+街道名+后缀),可以用正则来精准匹配:

import re

# 匹配常见地址格式:数字开头,后跟街道名和后缀
address_pattern = re.compile(r'^\d+.*(st|ave|rd|blvd|dr|ln)\b', re.IGNORECASE)

def is_address(entry):
    return bool(address_pattern.search(entry))

# 示例用法
mixed_list = ["John Doe", "123 Main St", "Jane O'Connor", "456 Oak Ave", "Robert J. Smith"]
names = [item for item in mixed_list if not is_address(item)]
addresses = [item for item in mixed_list if is_address(item)]

注意边缘情况

如果遇到特殊情况(比如姓名里带数字,或者地址没有数字/后缀),可以根据你的数据特征调整规则,比如:

  • 姓名通常是1-3个词,地址词数更多
  • 地址可能包含城市/州缩写(比如"NY"、"CA")

内容的提问来源于stack exchange,提问作者Averyf00350

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:55:26