如何实现长文本中每次出现sentence时截取50字符的处理?
需求与解决方案
问题背景
我有一个长文本字段,需要实现:每当文本中出现Sentence一词时,从该词开始截取50个字符。尝试了substring和instring的组合用法,但未能成功实现需求。
原始数据
| Column A | Column B |
|---|---|
| S101 | Sentence 1: 从前有个穷小子,每天挨家挨户卖报纸赚钱上学。有一天,他在走街串巷时,开始感到浑身无力。这孩子饿得不行,于是决定到下一户人家讨点吃的。 Sentence 2: 穷小子多次讨食都被拒绝,直到来到一个女孩家门前。他讨了一杯水,女孩见他可怜,给他端来了一杯牛奶。男孩问要付多少钱,女孩却拒绝收费。Sentence 3: 多年后,那个女孩长大成人,得了重病。她看了一个又一个医生,都没人能治好她。最后,她去找了镇上最好的医生。Sentence 4: 医生花了几个月时间治疗,终于把她治好。她虽然很高兴,但担心付不起账单。然而,当医院递给她账单时,上面写着:‘已用一杯牛奶全额付清。’ |
| S102 | Sentence 1: 从前有个国王叫迈达斯,他帮森林之神萨堤罗斯做了件好事。酒神狄俄尼索斯因此答应满足他一个愿望。 Sentence 2: 迈达斯许愿,希望自己触摸到的一切都变成金子。尽管狄俄尼索斯试图劝阻,迈达斯坚持这是个绝妙的愿望,于是愿望被实现了。 Sentence 3: 迈达斯对新获得的能力兴奋不已,开始触摸各种物品,把它们都变成纯金。 |
期望输出
| Column A | Column B |
|---|---|
| S101 | Sentence 1: 从前有个穷小子,每天挨家挨户卖报纸赚 Sentence 2: 穷小子多次讨食都被拒绝,直到来到一个女 Sentence 3: 多年后,那个女孩长大成人,得了重病。她 Sentence 4: 医生花了几个月时间治疗,终于把她治好。 |
| S102 | Sentence 1: 从前有个国王叫迈达斯,他帮森林之神萨 Sentence 2: 迈达斯许愿,希望自己触摸到的一切都变成 Sentence 3: 迈达斯对新获得的能力兴奋不已,开始触摸 |
解决方案
方案1:Oracle SQL实现
利用正则表达式拆分每个Sentence片段,截取前50字符后拼接:
WITH split_sentences AS ( SELECT t.Column_A, REGEXP_SUBSTR(t.Column_B, 'Sentence[^S]+', 1, LEVEL) AS sentence_part FROM your_table t CONNECT BY LEVEL <= REGEXP_COUNT(t.Column_B, 'Sentence') AND PRIOR t.Column_A = t.Column_A AND PRIOR SYS_GUID() IS NOT NULL ) SELECT Column_A, LISTAGG(SUBSTR(sentence_part, 1, 50), ' ') WITHIN GROUP (ORDER BY LEVEL) AS Column_B FROM split_sentences GROUP BY Column_A;
代码说明:
REGEXP_SUBSTR(...):匹配从Sentence开始到下一个Sentence开头前的所有内容;REGEXP_COUNT(...):统计文本中Sentence的出现次数,控制循环层级;SUBSTR(sentence_part, 1, 50):对每个片段截取前50个字符;LISTAGG(...):将所有处理后的片段用空格拼接成最终文本。
方案2:Python实现
用正则表达式提取所有Sentence片段,处理后拼接:
import re def process_text(text): # 匹配所有以Sentence开头的片段,直到下一个Sentence或文本结束 pattern = r'Sentence.*?(?=Sentence|$)' matches = re.findall(pattern, text, re.DOTALL) # 截取每个片段前50字符并拼接 return ' '.join([part[:50] for part in matches]) # 测试使用 sample_text = "Sentence 1: 从前有个穷小子,每天挨家挨户卖报纸赚钱上学。..." print(process_text(sample_text))
内容的提问来源于stack exchange,提问作者Chinu
相关产品推荐
相关产品推荐

