将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))
关键修改说明:
- 统一用4个空格缩进,彻底避免混合Tab和空格的问题
- 导入了
re模块,保证正则表达式功能正常 - 用
set存储停用词,比列表的查找速度快很多 - 改用列表推导式处理文本分割和小写转换,比map更直观易懂
- 修正了停用词筛选逻辑,符合“提取非停用词”的常规需求
- 用
with语句读取文件,自动处理文件关闭,更安全规范
内容的提问来源于stack exchange,提问作者Lovepreet Singh Batth
相关产品推荐
相关产品推荐

