如何判断nltk.Text.findall() API在客户端逻辑中的调用成功与失败
方案1:直接调用底层匹配逻辑(更推荐)
你已经看到了findall的底层实现是调用_token_searcher.findall获取匹配结果,完全可以直接调用这个底层方法拿到原始结果,直接判断即可,不需要依赖打印输出:
import nltk raw = "Management Discussion and Analysisss" raw = raw.lower() tokens = nltk.word_tokenize(raw) text = nltk.Text(tokens) # 直接获取匹配结果列表,逻辑和原API完全一致 match_results = text._token_searcher.findall(r"<.*> <.*> <.*> <analysis>") if match_results: # 匹配成功,按需处理结果即可 formatted_res = [" ".join(item) for item in match_results] print("匹配成功,结果:", "; ".join(formatted_res)) else: print("未匹配到任何内容")
这个方案没有额外开销,逻辑和官方实现完全对齐,稳定性最高。
方案2:捕获标准输出判断结果
如果你必须要调用原生的findall方法,可以通过临时重定向标准输出捕获它的打印内容,判断内容是否为空即可:
import nltk import io import sys raw = "Management Discussion and Analysis" raw = raw.lower() tokens = nltk.word_tokenize(raw) text = nltk.Text(tokens) # 临时替换标准输出为内存缓存 temp_stdout = io.StringIO() origin_stdout = sys.stdout sys.stdout = temp_stdout try: text.findall(r"<.*> <.*> <.*> <analysis>") finally: # 无论是否报错都恢复标准输出,避免影响后续代码 sys.stdout = origin_stdout output = temp_stdout.getvalue().strip() if output: print(f"匹配成功,输出内容:{output}") else: print("未匹配到任何内容")
这个方案不需要修改原调用逻辑,但需要注意必须恢复标准输出,否则后续的所有打印都会失效。
内容的提问来源于stack exchange,提问作者Mantosh Kumar
相关产品推荐
相关产品推荐

