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

为什么re.search第一次执行正常,第二次尝试就抛出正则错误?

问题解答

1. 为什么循环会触发2次input请求

你定义banned_words的写法存在错误:你预期它是存储正则规则的元组,但Python中单元素元组必须在元素末尾加逗号才会被识别为元组。你写的(r"N[a-zA-Z0-9]gga")没有加逗号,括号仅起到运算优先级修饰的作用,最终banned_words实际是字符串类型。

for循环遍历字符串时,会逐个取出字符串的每个字符作为banned_word的值,你的正则字符串长度远大于2,所以循环会执行多次,每次循环都会触发一次input()请求,自然会出现多次输入提示。

2. 为什么会出现unterminated character set报错

第二次循环时取出的banned_word是字符串的第二个字符[,这个字符在正则语法中是字符集的起始标记,单独作为正则pattern时没有对应的]闭合,所以正则解析时直接抛出「未闭合的字符集」报错。

修复方案

  • 首先修正banned_words的元组定义,单元素后加逗号:
# 修正为元组类型,末尾加逗号
banned_words = (r"N[a-zA-Z0-9]gga",)
  • 如果后续需要加多个违禁词正则,直接在元组里追加即可:
banned_words = (
    r"N[a-zA-Z0-9]gga",
    r"其他违禁词正则1",
    r"其他违禁词正则2"
)
  • 你当前的逻辑是每个违禁词都触发一次输入请求,不符合实际需求,应该先拿用户输入,再遍历所有违禁词匹配,修正后的完整逻辑参考:
from re import search, IGNORECASE

banned_words = (r"N[a-zA-Z0-9]gga",)
# 先取用户输入,再遍历匹配所有违禁词
user_input = input("> ")
for banned_word in banned_words:
    if search(banned_word, user_input, IGNORECASE):
        print("N-word detected")
        break # 匹配到就退出循环,不需要继续检查

内容的提问来源于stack exchange,提问作者Machinexa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:57:05