优化复杂括号结构提取逻辑:Regex/Python/Awk方案咨询
文本提取需求与优化方案
需求说明
需要处理从REST API获取的文本数据,按以下规则提取内容并保存到文件:
- 提取每行最后一对最外层括号内的全部内容
- 对提取出的内容,保留每个嵌套括号前的部分(即移除所有
(...)格式的子串)
样例输入
test test123 - test (bla bla1 (On chutti)) test test123 bla12 teeee (Rinku Singh) balle balle (testagain) (Rohit Sharma) test test123 test1111 test45345 (Surya) (Virat kohli (Lagaan)) testagain blae kaun hai ye banda (Ranbir kapoor (Lagaan), Milkha Singh (On chutti) (Lagaan))
预期输出
bla bla1 Rinku Singh Rohit Sharma Virat kohli Ranbir kapoor, Milkha Singh
原正则问题
你之前尝试的正则分支过多、结构复杂,可读性差,且面对多种嵌套场景容易匹配失效,需要优化。
优化方案
1. 简化正则实现
采用分步处理的方式,逻辑更清晰且兼容性更强:
- 第一步:提取每行最后一对最外层括号内的内容
- 第二步:移除提取内容中所有
(...)格式的子串
核心正则规则
- 提取最后括号内容:
.*\(([^()]+(?:\([^()]*\)[^()]*)*)\) - 移除括号子串:
\s*\(.*?\)
Python代码实现
import re with open("input.txt", "r") as f_in, open("output.txt", "w") as f_out: for line in f_in: line = line.strip() # 匹配最后一对最外层括号内的内容 match = re.search(r'.*\(([^()]+(?:\([^()]*\)[^()]*)*)\)', line) if match: content = match.group(1) # 移除所有括号及内部内容 result = re.sub(r'\s*\(.*?\)', '', content) f_out.write(result + "\n")
2. Awk实现方案
Awk处理嵌套括号需要自定义函数定位括号边界,以下是完整实现:
# 定位最后一对最外层括号的内容 function find_last_bracket(str, start, end, depth) { start = 0 end = 0 depth = 0 # 从字符串末尾反向遍历找括号边界 for (i = length(str); i >= 1; i--) { c = substr(str, i, 1) if (c == ")") { depth++ if (depth == 1) end = i } else if (c == "(") { depth-- if (depth == 0) { start = i break } } } if (start > 0 && end > start) { return substr(str, start+1, end-start-1) } return "" } { content = find_last_bracket($0) if (content != "") { # 移除所有括号及内部内容 gsub(/\s*\([^)]*\)/, "", content) print content } }
使用方式:awk -f extract.awk input.txt > output.txt
3. 单步正则简化(可选)
如果想用单正则直接匹配结果,可使用以下规则(仅适合结构较规整的场景):
.*\(([^()]+)(?:\([^)]*\))?(?:,\s*([^()]+)(?:\([^)]*\))?)*\)
内容的提问来源于stack exchange,提问作者RavinderSingh13
相关产品推荐
相关产品推荐

