如何在Python中提取字符串数字?及Pandas数据框提取指定面积数值
嘿,这个需求太常见啦!我给你几种实用的方法,你可以根据自己的具体场景挑:
方法1:正则表达式(最灵活)
如果你要提取所有数字(包括整数、小数、带负号的),用re.findall()绝对是首选。比如:import re s = "abc123def45.67ghi-89" numbers = re.findall(r'-?\d+\.?\d*', s) print(numbers) # 输出 ['123', '45.67', '-89']简单解释下这个正则:
-?匹配可选的负号,\d+抓一个或多个数字,\.?匹配可选的小数点,\d*匹配小数点后可能存在的数字。要是你只需要正整数,把后面的\.?\d*去掉,改成r'-?\d+'就行。方法2:遍历字符串筛选(适合简单场景)
要是你只需要正整数,而且不需要区分单独的数字,也可以直接遍历字符串筛选:s = "abc123def45" digits = ''.join([c for c in s if c.isdigit()]) print(digits) # 输出 '12345'这个方法简单粗暴,但没法处理小数、负号,还会把所有数字连在一起,适合需求简单的情况。
这个场景的关键是要搞定数字和sq之间的不可中断空格(也就是Unicode里的\u00A0),普通的空格匹配可能会失效,我给你两个靠谱的方案:
方案1:正则精准提取(推荐)
用Pandas的str.extract()方法,直接匹配字符串开头的数字,不管后面的特殊空格和其他内容:import pandas as pd import re # 先构造示例数据(包含不可中断空格) df = pd.DataFrame({'area': ['568\xa0sq mi (1,471 km2)', '1234\xa0sq mi (3196 km2)', '789 sq mi (2043 km2)']}) # 提取开头的数字,兼容普通空格和不可中断空格 df['area_num'] = df['area'].str.extract(r'^(\d+)', expand=False) # 要是你想更精准匹配数字+不可中断空格+sq的结构,可以改成: # df['area_num'] = df['area'].str.extract(r'^(\d+)\u00A0sq', expand=False) print(df)运行后输出:
area area_num 0 568 sq mi (1,471 km2) 568 1 1234 sq mi (3196 km2) 1234 2 789 sq mi (2043 km2) 789解释下:
^(\d+)匹配字符串开头的一个或多个数字,括号用来捕获这个我们需要的数字组,str.extract()会自动提取这个组的内容。如果你的数据里两种空格都有,用\s(匹配所有空白字符)替换\u00A0就行,比如r'^(\d+)\s+sq'。方案2:拆分字符串处理(简单直接)
因为数字在字符串最开头,也可以用str.split()拆分,指定分隔符为不可中断空格:df['area_num'] = df['area'].str.split('\u00A0').str[0]这个方法更简单,但前提是数字后面一定紧跟不可中断空格+sq,而且开头没有其他干扰字符。如果数据里混合了普通空格和不可中断空格,可以先统一替换再拆分:
df['area_num'] = df['area'].str.replace(r'\s', ' ').str.split(' ').str[0]
内容的提问来源于stack exchange,提问作者Hussein Khalaf

