如何使用regex仅按首次匹配分割pandas DataFrame列拆分捐赠人姓名与地址
解决方案
问题原因
- 现有代码未指定拆分次数,pandas的
str.split方法默认n=-1,会对所有匹配到的规则执行拆分 - 直接用
\d作为拆分规则会把地址开头的数字当作分隔符删除,无法得到完整地址 - 第二种换行格式的内容没有先处理换行符,会导致拆分逻辑失效
修正代码
import pandas as pd url = ("http://www.voterfocus.com/CampaignFinance/candidate_pr.php?op=rp&e=8&c=munmiamibeach&ca=64&sdc=116&rellevel=4&dhc=774&committee=N") dfs = pd.read_html(url) df = dfs[0] # 先替换列内的换行符为空格,统一格式 df['Contributor'] = df['Contributor'].str.replace(r'\n', ' ', regex=True) # 方法1:用str.extract直接匹配两组内容,兼容性更强 df[['Col1', 'Col2']] = df['Contributor'].str.extract(r'^(\D+)(.*)$', expand=True) # 去除两列的首尾空白字符 df['Col1'] = df['Col1'].str.strip() df['Col2'] = df['Col2'].str.strip()
可选split实现方式
如果坚持用split方法实现,可按如下调整,核心是加零宽断言避免吞掉数字,加n=1限制仅拆分1次:
df[['Col1', 'Col2']] = df['Contributor'].str.split(r'(?=\d)', n=1, expand=True) df['Col1'] = df['Col1'].str.strip() df['Col2'] = df['Col2'].str.strip()
规则说明
\D匹配所有非数字字符,会从开头一直匹配到第一个数字出现的位置,刚好对应捐赠人姓名.*匹配第一个数字之后的所有内容,对应完整地址n=1参数限制str.split仅执行1次拆分,不会拆分后续地址内的数字
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

