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

PySpark中regexp_extract提取电影标题年份结果错误的问题排查

修正PySpark提取电影年份的正则表达式问题

问题分析

原正则的核心问题:

  • 对「最后一个括号」的判断逻辑错误,原正则(?=[^\(]*$)仅检查后续无左括号,但未确保当前匹配的数字所在括号是最后一个,导致误匹配非末尾括号内的数字(如(Paris, 1871)里的1871)
  • 未限制末尾数字的前置条件,存在误匹配开头数字串的风险

修正后的代码

import pyspark.sql.functions as F
from pyspark.sql.functions import regexp_extract, col

# 优先匹配最后一个括号内的4位数字,再匹配标题末尾、前面带空格的4位数字
year_regex = r"(?<=\()\d{4}(?=\)[^()]*$)|(?<=\s)\d{4}$"
movies_DF = movies_DF.withColumn('yearOfRelease', regexp_extract("title", year_regex, 0))
movies_DF.display(10000)

正则逻辑说明

  • 第一个分支(?<=\()\d{4}(?=\)[^()]*$):
    • (?<=\():正向回顾,确保数字前是左括号
    • \d{4}:匹配4位数字
    • (?=\)[^()]*$):正向预查,确保数字后是右括号,且后续直到标题结尾无任何括号(保证是最后一个括号内的数字)
  • 第二个分支(?<=\s)\d{4}$:
    • (?<=\s):正向回顾,确保数字前是空格(避免匹配开头的数字串)
    • \d{4}$:匹配标题末尾的4位数字

测试验证

针对你的示例标题,修正后提取结果:

  • Grumpier Old Men (1995) → 1995
  • Death Note: Desu nôto (2006–2007) → 2006
  • Irwin & Fran 2013 → 2013
  • 9500 Liberty (2009) → 2009
  • Captive Women (1000 Years from Now) (3000 A.D.) (1952) → 1952
  • The Garden of Afflictions 2017 → 2017
  • The Naked Truth (1957) (Your Past Is Showing) → 1957
  • Conquest 1453 (Fetih 1453) (2012) → 2012
  • Commune, La (Paris, 1871) (2000) → 2000
  • 1013 Briar Lane → 空值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:00:16