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

Python正则提取指定词数的最内层括号间文本

解决方案

要解决嵌套括号场景下提取指定单词数的括号内文本问题,需要先匹配完整的平衡括号对(支持嵌套),再筛选其中内容符合单词数量要求的部分,具体实现如下:

方法一:先匹配所有平衡括号对,再筛选单词数

这种方式逻辑清晰,易于调整单词数量要求:

import re

def extract_bracket_text_with_word_count(text, target_word_count):
    # 匹配所有支持嵌套的平衡括号对
    bracket_pattern = r'\((?:[^()]|(?R))*\)'
    all_bracket_matches = re.findall(bracket_pattern, text)
    
    result = []
    for match in all_bracket_matches:
        # 提取括号内的内容并去除首尾空白
        inner_content = match[1:-1].strip()
        # 按空白分割成单词,过滤空字符串(处理连续空格)
        words = [word for word in inner_content.split() if word]
        if len(words) == target_word_count:
            result.append(inner_content)
    return result

# 测试示例
text = "bla bla (bla ( bla bla) bla bla (bla bla bla) bla"
print(extract_bracket_text_with_word_count(text, 2))  # 输出: [' bla bla']

方法二:正则直接匹配符合条件的括号对

如果想一步到位,可结合正向预查确保括号内内容恰好包含指定数量的单词,同时匹配平衡括号对:

import re

text = "bla bla (bla ( bla bla) bla bla (bla bla bla) bla"
# 匹配括号内恰好2个单词的平衡括号对,提取内部内容
pattern = r'\((?=(?:\s*\S+){2}\s*\))(?:[^()]|(?R))*\)'
matches = re.findall(pattern, text)
# 提取括号内的内容
result = [match[1:-1].strip() for match in matches]
print(result)  # 输出: [' bla bla']

关键说明

  1. 平衡括号匹配:\((?:[^()]|(?R))*\) 是Python支持的递归正则,(?R)表示递归匹配整个正则表达式,能正确识别嵌套的括号对,避免匹配到中途的右括号。
  2. 单词数判断:(?:\s*\S+){2} 表示恰好2个由任意空白分隔的非空白单词(\S+代表单词,可根据需求替换为\b\w+\b限定字母数字单词)。
  3. 原有正则失效原因:(?<=\()(.*?)(?=\)) 是非贪婪匹配,会匹配到第一个遇到的右括号,无法处理嵌套场景下的完整括号对。

内容的提问来源于stack exchange,提问作者miciobauciao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:45:36