You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则能否匹配穿插最多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:25:06