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)→1995Death Note: Desu nôto (2006–2007)→2006Irwin & Fran 2013→20139500 Liberty (2009)→2009Captive Women (1000 Years from Now) (3000 A.D.) (1952)→1952The Garden of Afflictions 2017→2017The Naked Truth (1957) (Your Past Is Showing)→1957Conquest 1453 (Fetih 1453) (2012)→2012Commune, La (Paris, 1871) (2000)→20001013 Briar Lane→ 空值
内容的提问来源于stack exchange,提问作者pang sai
相关产品推荐
相关产品推荐

