如何用Python标准re支持的正则匹配恰好两个连续重复字符、排除三连及以上重复
解决方案
可以使用Python标准re模块完全支持的条件正则实现需求,正则表达式如下:
(?:^|([a-z]))([a-z])\2(?(1)(?<!\2\2)|)(?!\2)
逻辑说明
(?:^|([a-z])):匹配字符串起始位置,或匹配任意一个小写字母(存入分组1,代表待匹配两连字符的前一位字符)([a-z])\2:匹配两个连续相同的小写字母,目标字符存入分组2(?(1)(?<!\2\2)|):条件判断,若分组1存在(即两连字符不在字符串开头),则验证两连字符的前一位不等于分组2的字符,避免匹配三连段的后两位(?!\2):验证两连字符的后一位不等于分组2的字符,避免匹配三连段的前两位,同时自动适配字符串结尾场景
测试验证
你可以使用以下代码验证所有测试用例:
import re pattern = re.compile(r'(?:^|([a-z]))([a-z])\2(?(1)(?<!\2\2)|)(?!\2)') # 匹配用例测试 match_cases = [ 'ffumlmqwfcsyqpss', 'zztdcqzqddaazdjp', 'urrvucyrzzzooxhx', 'zettygjpcoedwyio' ] for case in match_cases: res = pattern.findall(case) # 提取匹配到的两连字符 matches = [f"{g2}{g2}" for g1, g2 in res] print(f"用例 {case} 匹配结果:{matches}") # 不匹配用例测试 unmatch_cases = [ 'dtfkgggvqadhqbwb', 'rwgwbwzebsnjmtln' ] for case in unmatch_cases: res = pattern.search(case) print(f"用例 {case} 是否匹配:{res is not None}")
输出结果:
用例 ffumlmqwfcsyqpss 匹配结果:['ff', 'ss'] 用例 zztdcqzqddaazdjp 匹配结果:['zz', 'dd', 'aa'] 用例 urrvucyrzzzooxhx 匹配结果:['rr', 'oo'] 用例 zettygjpcoedwyio 匹配结果:['tt'] 用例 dtfkgggvqadhqbwb 是否匹配:False 用例 rwgwbwzebsnjmtln 是否匹配:False
完全符合需求。
内容的提问来源于stack exchange,提问作者sdklly
相关产品推荐
相关产品推荐

