如何在Pandas DataFrame中精准提取文本内括号包裹的年份数字
Pandas 精准提取文本列括号内年份的实现方案
问题根因
此前直接使用\d\d\d\d做正则匹配没有前置上下文约束,只要字符串中出现连续四位数字就会被命中,因此碰到Νόμος 4000 (1962)这类文本时,会优先匹配到括号外的4000,无法拿到括号内的目标年份。
核心正则优化
把匹配范围锁定在左括号紧跟四位数字的结构上,通过捕获组提取括号内的数字内容,从规则上排除括号外的四位数字干扰。
基础适配正则:\((\d{4})\)
- 规则逻辑:匹配字面意义的英文左括号
(,紧跟连续四位阿拉伯数字,其中四位数字被纳入捕获组,是最终需要提取的目标值 - 鲁棒性拓展:如果需要兼容括号与数字之间存在空格的场景(如
( 1990 )),可将正则调整为\(\s*(\d{4})\s*\),通过\s*匹配零到多个空白字符,适配不同排版的多语种文本
完整实现步骤
- 加载构造示例DataFrame
import pandas as pd # 构建多语种文本示例数据 text_list = [ "Césio 137 - O Pesadelo de Goiânia (1990)", "Nattbuss 807 (1997)", "Νόμος 4000 (1962)" ] df = pd.DataFrame({"source_text": text_list})
- 调用字符串方法提取目标年份
# 提取括号内的四位年份值 df["extracted_year"] = df["source_text"].str.extract(r'\((\d{4})\)')
- 结果验证
运行后extracted_year列的输出完全符合预期:
1990 1997 1962
方案特性
str.extract方法会自动返回正则中捕获组的内容,不会将匹配到的括号字符一并返回- 规则强制要求四位数字必须紧跟在左括号之后,从根源上规避文本中夹带的其他四位数字(如示例中的4000)造成的误匹配
- 对带特殊字符的多语种文本无额外解析要求,不依赖特定语言的识别能力,适配性广
内容的提问来源于stack exchange,提问作者SAI SRIKAR
相关产品推荐
相关产品推荐

