如何用正则表达式匹配不含[ABC][ABC]序列的拉丁字母片段
问题分析与解决
你的正则(?!.*[ABC][ABC]).+逻辑存在问题:它是从整个匹配子串的角度做负前瞻,要求匹配的内容里完全找不到[ABC][ABC]序列,而且是贪婪匹配最长的符合条件的串。但原字符串里存在多处连续的A/B/C组合(比如BC、AB、CA),前面的长串因为.*会覆盖到这些后续的连续组合,导致负前瞻条件不满足,只有最后一个单独的A符合要求,所以只输出了它。
正确解法
要匹配所有内部不含连续[ABC][ABC]的最长子串,可以用这个正则:
import re pattern = r'[^ABC]*(?:[ABC][^ABC]+)*[ABC]?' text = 'AGSHDGSGBCHAHSNABHJDKOCA' matches = re.findall(pattern, text) # 过滤可能出现的空字符串 matches = [m for m in matches if m] print(matches)
执行后会输出预期结果:['AGSHDGSGB', 'CHAHSNA', 'BHJDKOC', 'A']
正则逻辑说明
[^ABC]*:匹配任意数量的非A/B/C字符,处理子串开头的非目标字符(?:[ABC][^ABC]+)*:重复匹配「一个A/B/C字符 + 任意数量的非A/B/C字符」,确保每个A/B/C后面都跟着非目标字符,从根源避免出现连续的A/B/C组合[ABC]?:可选匹配末尾的一个A/B/C字符,处理子串以A/B/C结尾且后面无其他字符的场景
内容的提问来源于stack exchange,提问作者ganspuzzles
相关产品推荐
相关产品推荐

