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

PySpark正则表达式提取括号内最后元素问题求助

解决提取字符串最后一组括号内内容的问题

看起来你遇到的问题是正则匹配的贪婪性和捕获组使用不当导致的,我来帮你梳理一下并给出解决方案:

问题分析

  • 你的第一个正则 (?<=\\().+?(?=\\)) 使用了非贪婪匹配(+?),所以会找到字符串中第一个出现的括号对,提取里面的内容,这就是为什么多组括号时会拿到123而不是最后一组的hi。
  • 第二个正则 \\(([^)]+)\\)?$ 虽然定位到了结尾的括号,但你用了捕获组索引0(默认值),这个索引返回的是整个正则匹配的内容(也就是带括号的(hi)),而不是你需要的括号内的文本。

解决方案

我们需要调整正则,让它定位到最后一组括号,并且只提取括号内的内容。可以用下面的正则配合捕获组索引1来实现:

tmp = tmp.withColumn("needed", regexp_extract(col("txt"), ".*\\(([^)]+)\\)", 1));

正则解释

  • .*:贪婪匹配任意数量的任意字符,这样会一直匹配到字符串中最后一个(的位置,确保我们定位到最后一组括号。
  • \\(:匹配左括号(因为括号是正则特殊字符,需要用反斜杠转义)。
  • ([^)]+):这是我们的捕获组,匹配一个或多个不是右括号的字符,也就是括号内的目标内容。
  • \\):匹配右括号。
  • 最后用捕获组索引1,直接提取这个捕获组里的内容,而不是整个匹配结果。

修改后的运行结果

调整后你的tmp.show()会输出:

+---+--------------------+---+----+------+
| id|                 txt|old| new|needed|
+---+--------------------+---+----+------+
| 1|foo (123) oiashdj...|123|(hi)|    hi|
| 2| bar oiashdj (hi)| hi|(hi)|    hi|
+---+--------------------+---+----+------+

完全符合你需要的结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:27:28