无法使用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
相关产品推荐
相关产品推荐

