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']
关键说明
- 平衡括号匹配:
\((?:[^()]|(?R))*\)是Python支持的递归正则,(?R)表示递归匹配整个正则表达式,能正确识别嵌套的括号对,避免匹配到中途的右括号。 - 单词数判断:
(?:\s*\S+){2}表示恰好2个由任意空白分隔的非空白单词(\S+代表单词,可根据需求替换为\b\w+\b限定字母数字单词)。 - 原有正则失效原因:
(?<=\()(.*?)(?=\))是非贪婪匹配,会匹配到第一个遇到的右括号,无法处理嵌套场景下的完整括号对。
内容的提问来源于stack exchange,提问作者miciobauciao
相关产品推荐
相关产品推荐

