繁体   English   中英

Python-仅允许将特定的单词(变量)和数学运算符作为输入

[英]Python - only allow specific words (variables) and mathematical operators as input

python中验证字符串的最佳方法是什么,以使其仅包含特定(预定义)的单词或其他一些字符(例如+,-,/,*,(,)]?

我的最终目标是验证输入(将用作数学公式的字符串),例如:

foo = Valid
fooo = Invalid
bar = Valid
foo/(bar+foo) = Valid
foo*bar - foo = Valid
foo + tree = Invalid
+ = Invalid 

我一直在寻找并发现类似的问题,但似乎没有一个完全符合我的需求。 我已经设法创建了一个有缺陷的解决方法,在其中我可以执行以下操作:

allowed_words = ('foo', 'bar', ' + ') # and so on... which is tedious 
input_str = raw_input("foo + bar")
split_string = re.split('(\W+)', input_str)
for word in split_string:
    match = False
    for allowed_word in allowed_words:
        if word == allowed_word:
            match = True
        else:
            pass
    if match == True:
        print "%s is valid" % word
    else:
        print "%s is NOT valid" % word 

我也尝试使用

if not re.match = ("(\\b(?=foo\\b|bar\\b|\\d+\\b)\\w+\\b)|\\s|[*/+()-]", input_str)

似乎在这里工作: http: //regexr.com(但我怀疑re.match不是正确的方法。)

有人可以告诉我实现目标的最佳方法吗? 谢谢。

这是规范的词法分析功能:如何将字符串识别为有效标记并解释它们是否有效?

涉及到正则表达式,但并不以您认为的方式进行:当您具有要匹配的形式语法时,正则表达式本身通常是不够的(您可以这样做,否则简单地使用+而不包含操作数将被视为有效)。

PLY是用Python编写的解析器-词法分析器,本质上是Lex和Yacc的端口。 解决该问题将减轻很多负担,并且只需很少的代码即可完成此任务。

您的语法几乎就是经过简单修改的​​计算器语法(以下为Brackus-Naur格式):

表达式:表达式+词| 表达-期限| 术语

期限:期限*因素| 项/因子| 因子

因素:IDENTIFIER | (表情)

其中的IDENTIFIER可以代表您想要的任何有效单词。 您甚至可以更进一步,将IDENTIFIER替换为您要解析的特定单词。 我链接到的PLY页面提供了有关如何实现此功能的完整教程,并附有代码。

对于词法分析器,您只需要指定与标记匹配的各个正则表达式即可。 换句话说,您只需要告诉词法分析器将所有看起来像+字符串标记为PLUS ,而不是将这些字符的所有可能组合标记为。 这省去了很多麻烦:您不再只有一个与整个字符串匹配的正则表达式,而只有一个正则表达式来标识字符串的每个部分。 同样,PLY文档详尽介绍了此内容。

我同意Liongold所说的一切。 但是让我们暂时假设您的要求只是您明确声明的内容:

python中验证字符串以使其仅包含特定(预定义)单词或其他一些字符的最佳方法是什么?

那么您只需稍稍调整一下正则表达式即可满足要求:

^([\s*\/+()-]*(?=foo\b|bar\b|\d+\b)\w+[\s*\/+()-]*)+$

(我去除了模式结尾处的|\\s|[*/+()-]并将该逻辑移到括号中,同时还要考虑领先的运算符,然后对整个结构进行了量化:

运算符/空格SPECIALWORD运算符/空格 ),其中的一个或多个以^$锚定,以确保整行必须匹配。

撇开:您也不需要“吃掉” \\ b边界,因为它们的宽度为零,并且您一无所获。

此处演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM