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
相关产品推荐
相关产品推荐

