求可匹配任意重复句子的优雅通用正则表达式方案
匹配任意数量重复句子的通用正则表达式
现有实现
我已经写了一个支持最多3句重复匹配的正则,通过扩展模式可以支持指定最大重复句数,正则为:(.*?\.)( .*?\.)?( .*?\.)? \1\2?\3?
这个正则能处理1句、2句或3句的重复场景,Python使用示例:
import re string = 'Red apple. Green pepper. Yellow onion. Red apple. Green pepper. Yellow onion.' output = re.sub(r'(.*?\.)( .*?\.)?( .*?\.)? \1\2?\3?', r'\1\2\3', string, flags=re.MULTILINE) print(output) # 输出:Red apple. Green pepper. Yellow onion.
通用解决方案
要实现匹配任意数量连续重复句子的优雅通用正则,可以用捕获组匹配一个或多个句子组成的块,再匹配该块的重复内容,正则表达式如下:((?:.*?\.)(?: .*?\.)*) \1
正则解析
(?:.*?\.):非捕获组,匹配单个以句号结尾的句子(非贪婪匹配,避免过度匹配)(?: .*?\.)*:非捕获组,匹配零个或多个后续句子,每个句子前带空格((?:.*?\.)(?: .*?\.)*):捕获组,匹配由1个或多个连续句子组成的完整块\1:匹配空格后重复的该句子块
Python示例
import re # 测试2句重复场景 test_str_1 = 'Hello world. This is a test. Hello world. This is a test.' result_1 = re.sub(r'((?:.*?\.)(?: .*?\.)*) \1', r'\1', test_str_1, flags=re.MULTILINE) print(result_1) # 输出:Hello world. This is a test. # 测试多句重复场景 test_str_2 = 'Line 1. Line 2. Line 3. Line 4. Line 1. Line 2. Line 3. Line 4.' result_2 = re.sub(r'((?:.*?\.)(?: .*?\.)*) \1', r'\1', test_str_2, flags=re.MULTILINE) print(result_2) # 输出:Line 1. Line 2. Line 3. Line 4.
注意事项
- 如果需要匹配跨换行的重复句子块,保留
re.MULTILINE标志的同时,可将空格部分调整为[ \n]以兼容换行分隔的情况 - 若句子中包含缩写等带句号的特殊情况,需要将
.*?替换为更精准的匹配规则(例如[^.]*来匹配不含句号的内容)
内容的提问来源于stack exchange,提问作者analytical
相关产品推荐
相关产品推荐

