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

无法使用Regex/Contains()时,如何遍历相似句子列表提取差异书名?

提取共性句子中的唯一差异内容(书名)

如果所有句子除了书名之外完全一致,没法直接用正则或Contains()的话,核心思路是先找出所有句子的公共前缀和公共后缀,然后剥离这两部分就能拿到中间的书名了。这个方法完全不依赖特殊标记(比如《》),通用性极强,适合任何“仅某段内容不同,其余全一致”的短句场景。

具体步骤

  • 第一步:找出所有句子的最长公共前缀
    把所有句子放在一起,从第一个字符开始逐个对比,直到出现不一样的字符为止,前面完全相同的部分就是公共前缀。比如你的例子里,公共前缀就是名为《。
  • 第二步:找出所有句子的最长公共后缀
    反过来从最后一个字符开始对比,直到出现差异,后面完全相同的部分就是公共后缀。例子里的公共后缀是》的书籍是经典作品。
  • 第三步:剥离前后缀提取书名
    对每个句子,去掉前面的公共前缀和后面的公共后缀,剩下的就是你要的书名了。

代码示例(Python)

def extract_unique_content(sentences):
    if not sentences:
        return []
    
    # 找最长公共前缀
    prefix = sentences[0]
    for s in sentences[1:]:
        while not s.startswith(prefix):
            prefix = prefix[:-1]
            if not prefix:
                break
    
    # 找最长公共后缀
    suffix = sentences[0]
    for s in sentences[1:]:
        while not s.endswith(suffix):
            suffix = suffix[1:]
            if not suffix:
                break
    
    # 提取中间内容
    results = []
    for s in sentences:
        content = s[len(prefix):-len(suffix)] if suffix else s[len(prefix):]
        results.append(content.strip())
    
    return results

# 测试你的例子
sentences = [
    "名为《蝇王》的书籍是经典作品",
    "名为《杀死一只知更鸟》的书籍是经典作品",
    "名为《麦田里的守望者》的书籍是经典作品"
]

print(extract_unique_content(sentences))
# 输出: ['蝇王', '杀死一只知更鸟', '麦田里的守望者']

代码示例(C#)

using System;
using System.Collections.Generic;
using System.Linq;

public class ContentExtractor
{
    public static List<string> ExtractUniqueContent(List<string> sentences)
    {
        if (sentences == null || sentences.Count == 0)
            return new List<string>();
        
        // 找最长公共前缀
        string prefix = sentences[0];
        foreach (string s in sentences.Skip(1))
        {
            while (!s.StartsWith(prefix))
            {
                prefix = prefix.Substring(0, prefix.Length - 1);
                if (string.IsNullOrEmpty(prefix))
                    break;
            }
        }
        
        // 找最长公共后缀
        string suffix = sentences[0];
        foreach (string s in sentences.Skip(1))
        {
            while (!s.EndsWith(suffix))
            {
                suffix = suffix.Substring(1);
                if (string.IsNullOrEmpty(suffix))
                    break;
            }
        }
        
        // 提取内容
        List<string> results = new List<string>();
        foreach (string s in sentences)
        {
            int startIndex = prefix.Length;
            int length = s.Length - prefix.Length - suffix.Length;
            string content = s.Substring(startIndex, length).Trim();
            results.Add(content);
        }
        
        return results;
    }

    // 测试
    public static void Main()
    {
        List<string> sentences = new List<string>
        {
            "名为《蝇王》的书籍是经典作品",
            "名为《杀死一只知更鸟》的书籍是经典作品",
            "名为《麦田里的守望者》的书籍是经典作品"
        };
        
        var titles = ExtractUniqueContent(sentences);
        foreach (var title in titles)
        {
            Console.WriteLine(title);
        }
        // 输出:
        // 蝇王
        // 杀死一只知更鸟
        // 麦田里的守望者
    }
}

为什么这个方法比正则/Contains靠谱?

  • 完全不需要提前知道书名的格式(比如有没有《》、会不会包含特殊字符),只要句子其余部分完全一致就能用;
  • 不会因为书名里出现和前后缀类似的字符而提取错误;
  • 扩展性极强,不管是提取书名、产品名、人名,只要是“仅某段内容不同”的场景都适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:46