使用PyInputPlus的inputNum时allowRegexes参数正则不生效如何解决
问题根因
你遇到的问题核心是allowRegexes参数传值类型错误。PyInputPlus的allowRegexes要求传入正则表达式列表,你直接传入单个正则字符串时,程序会将字符串按字符迭代拆解为多条独立正则规则,其中包含单个s、q的匹配规则,只要输入内容包含s或q就会被放行,这才导致sam这类输入通过校验。
方案1:修正参数格式
把allowRegexes改为列表类型传入正则即可,只有完全匹配单个q/Q/s/S的非数字输入会被放行,其余非数字输入会被拦截要求重新输入:
msg = 'Enter value to add/replace or s to skip field or q to quit: ' answer = pyip.inputNum(prompt=msg, allowRegexes=[r'^[qQsS]$'], blank=False)
方案2:自定义校验逻辑(更可控)
如果不想依赖正则匹配的隐含规则,可以用inputCustom自己定义校验逻辑,避免踩参数坑:
def validate_input(input_str): lower_str = input_str.lower() if lower_str in ('q', 's'): return input_str # 校验是否为有效数字 try: float(input_str) return input_str except ValueError: raise Exception('输入无效,请输入数字、s跳过或q退出') msg = 'Enter value to add/replace or s to skip field or q to quit: ' answer = pyip.inputCustom(validate_input, prompt=msg, blank=False)
后续处理优化
拿到输入后先判断控制字符再转数字,进一步避免运行报错:
if answer.lower() == 'q': # 执行退出逻辑 elif answer.lower() == 's': # 执行跳过逻辑 else: num_val = float(answer) # 执行数字相关处理逻辑
内容的提问来源于stack exchange,提问作者trustory
相关产品推荐
相关产品推荐

