为什么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
相关产品推荐
相关产品推荐

