正则能否匹配穿插最多15个英文句号的至少25个左括号序列?
问题解答
能否用正则实现?
可以,但纯正则表达式会非常冗长、可读性差,维护成本极高。因为正则的核心是模式匹配而非计数统计,要实现“跨片段统计句号总数”需要嵌套多层正向预查来限制句号数量,同时确保左括号数量达标。
比如符合需求的Python兼容正则(仅作演示,不推荐实际使用):
(?=(?:[^(]*\(){25,})(?:[^(]*\()(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}(?:[^.]*(?:\.(?=(?:[^()]*\(){0,}[^.()]*\))*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*
这个表达式通过嵌套正向预查,每匹配一个句号就确保后续还有足够的左括号,同时限制句号总数不超过15,但实际开发中几乎没人会写这种表达式,排查问题难度极大。
更优的实现方式
方案1:正则+少量Python代码(推荐)
用简单正则定位包含至少25个左括号的片段,再通过字符串处理统计句号数量,逻辑清晰、易维护:
import re target_text = "...((((((((.(((..((..((((.(((((((.(..(((((.(((.(((...))).))).)))))..)..))))))).))))..))..))).))))))))(((.((.(((((...((........))))))))))))............" # 匹配包含至少25个左括号的片段(避免被右括号截断) pattern = re.compile(r'(?:[^)]*(?:\([^)]*){25,})') for match in pattern.finditer(target_text): fragment = match.group() # 定位片段内第一个和最后一个左括号的位置 first_paren_idx = fragment.find('(') last_paren_idx = fragment.rfind('(') if first_paren_idx == -1 or last_paren_idx == -1: continue # 统计两个括号之间的句号数量 dot_count = fragment[first_paren_idx:last_paren_idx+1].count('.') if dot_count <= 15: print("符合要求的片段:") print(fragment)
方案2:使用pyparsing等工具
如果你的需求后续可能扩展(比如增加更复杂的语法规则),可以用pyparsing这类专门的解析库,它提供了更直观的语法定义方式,代码可读性更高。但对于当前需求来说,方案1已经足够轻量高效,没必要额外引入依赖。
内容的提问来源于stack exchange,提问作者SJP
相关产品推荐
相关产品推荐

