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

将PHP函数转为Python3时出现IndentationError,求错误原因

解决IndentationError: unindent does not match any outer indentation level错误

兄弟,这个缩进错误本质上是你的代码里混合使用了制表符(Tab)和空格来缩进,或者同一代码块内的缩进空格数不统一导致的。Python对缩进的要求特别严格,同一层级的代码必须用完全一致的缩进方式(推荐用4个空格,别混用Tab和空格)。

不过我看你的代码除了缩进问题,还有不少其他小问题,一起帮你修正了:

先梳理你代码里的其他问题:

  • 没有导入re模块,正则表达式根本没法运行
  • 读取停用词文件时,open('stop_words.txt','r').read()会把整个文件读成一个大字符串,而不是我们需要的停用词列表,得按行读取并处理掉换行符
  • map(to_lower(x), stopwords)用法错误,正确写法应该是map(str.lower, stopwords),或者用lambda函数
  • 正则表达式不需要用/包裹,应该写成原始字符串r'[0-9\W]'
  • text.partition(',')只会把文本分割成三部分,应该用text.split(',')来得到所有分割后的单词列表
  • 逻辑搞反了:你现在是把停用词加入keywords,但通常我们是要保留非停用词;而且最后过滤空字符串的逻辑也需要调整

修正后的完整代码:

import re

def stopWords(text, stopwords):
    # 将停用词转为小写并转成集合(提升查找效率)
    stopwords_set = set(map(str.lower, stopwords))
    # 替换数字和非单词字符为逗号
    pattern = r'[0-9\W]'
    cleaned_text = re.sub(pattern, ',', text)
    # 分割文本为单词列表,同时转为小写
    text_array = [word.lower() for word in cleaned_text.split(',')]
    # 筛选出非空且不属于停用词的单词
    keywords = [term for term in text_array if term.strip() and term not in stopwords_set]
    return keywords

# 用with语句安全读取停用词文件,按行处理并去掉换行符
with open('stop_words.txt','r') as f:
    stopwords = [line.strip() for line in f.readlines()]

text = "All words in the English language can be classified as one of the eight different parts of speech."
print(stopWords(text, stopwords))

关键修改说明:

  1. 统一用4个空格缩进,彻底避免混合Tab和空格的问题
  2. 导入了re模块,保证正则表达式功能正常
  3. 用set存储停用词,比列表的查找速度快很多
  4. 改用列表推导式处理文本分割和小写转换,比map更直观易懂
  5. 修正了停用词筛选逻辑,符合“提取非停用词”的常规需求
  6. 用with语句读取文件,自动处理文件关闭,更安全规范

内容的提问来源于stack exchange,提问作者Lovepreet Singh Batth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:56