使用 pyinputplus 时,正则表达式似乎在 allowRegexes 参数中不起作用

Posted

技术标签:

【中文标题】使用 pyinputplus 时,正则表达式似乎在 allowRegexes 参数中不起作用【英文标题】:regex doesn't seem to work in allowRegexes parameter when using pyinputplus 【发布时间】:2021-08-02 01:50:08 【问题描述】:

我正在使用 pyinputplus,特别是 inputNum https://pyinputplus.readthedocs.io/en/latest/

这是我的代码的样子:

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)

我的目标是允许任何数字,但也允许以下 q,Q,s,S 之一。

但是,当我运行代码并输入“sam”时,代码会崩溃,因为稍后我会尝试转换为 float(answer)。

我的期望是 allowRegexes 不会允许这样做,并会再次向我显示重新输入的提示。 请指教!

【问题讨论】:

【参考方案1】:

如果您提供 allowRegexes 参数,pyip.inputNum 似乎会停止验证输入。请参阅allowRegexes doesn't seem work properly Github 问题。

您可以将inputCustom 方法与自定义验证方法一起使用:

import pyinputplus as pyip
import ast

def is_numeric(x):
    try:
        number = ast.literal_eval(x)
    except:
        return False
    return isinstance(number, float) or isinstance(number, int)

def raiseIfInvalid(text):
    if not is_numeric(text) and not text.casefold() in ['s', 'q']:
        raise Exception('Input must be numeric or "q"/"s".')

msg = 'Enter value to add/replace or s to skip field or q to quit: '
answer = pyip.inputCustom(raiseIfInvalid, prompt=msg)

所以,如果text 不等于intfloat 且不等于s/S/q/Q,则提示将重复出现。

【讨论】:

感谢@Wiktor Stribizew。你知道如何检查自定义异常并允许浮动吗?我相信 isumeric 不允许小数点 @trustory 这样的资源很多,见Check if a number is int or float。 This answer 可能会有所帮助。或者,查看this thread。 Stribizew 这也行吗?如果不是 string.replace(",","").isnumeric() @trustory 我添加了完整的代码 sn-p。现在对你有用吗?

以上是关于使用 pyinputplus 时,正则表达式似乎在 allowRegexes 参数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

OS X 上的 sed - 似乎无法在正则表达式中使用 +

输入类型=“数字”时,正则表达式验证是不是有效?

正则表达式仅在恰好出现一个匹配时匹配

弹簧控制器中的正则表达式

为啥正则表达式如此有争议? [关闭]

如何将正则表达式捕获存储在 Perl 的数组中?