如何用re.sub()替换单词后缀?为何出现str与int的&操作不支持报错?
解决单词后缀“ion”或“s”的删除问题
问题分析
你需要删除单词末尾的“ion”或“s”后缀、保留前面内容,但之前的代码存在逻辑错误:
- 第一段代码
re.sub(r'[a-z]+ion', "", llw)中,正则[a-z]+ion会匹配从单词开头到ion的全部字符,替换成空后直接删掉了整个匹配的单词,而非仅删除后缀。 - 第二段代码的错误点:
re.search参数顺序颠倒,正确格式是re.search(正则表达式, 目标文本),你写成了re.search(r'[a-z]+ion', "", llw),把空字符串作为搜索文本,llw被当成flags参数,导致类型错误。re.search返回匹配对象或None,不能直接用is True判断,只需if re.search(...)即可。re.sub不会修改原字符串,必须将返回结果重新赋值给变量才会生效。- 未处理
s后缀的需求。
正确实现方式
1. 处理单个单词
使用正则匹配单词末尾的ion或s,替换为空:
import re word = "reflection" processed_word = re.sub(r'(ion|s)$', '', word) print(processed_word) # 输出: reflect word2 = "tests" processed_word2 = re.sub(r'(ion|s)$', '', word2) print(processed_word2) # 输出: test
- 正则
(ion|s)$中,$表示匹配字符串末尾,确保只删除单词结尾的后缀。
2. 处理整段文本
结合单词边界\b,批量处理文本中的所有单词:
import re text = "reflections tests example cats action" processed_text = re.sub(r'\b(\w+?)(ion|s)\b', r'\1', text) print(processed_text) # 输出: reflect test example cat act
\b匹配单词边界,确保只处理完整单词;(\w+?)捕获单词中除后缀外的部分,(ion|s)匹配后缀;- 替换为
\1即保留捕获的前缀部分,删除后缀。
内容的提问来源于stack exchange,提问作者dmoses
相关产品推荐
相关产品推荐

