[英]How to use 'input' to input mathematical functions as variables in python 3.x
[英]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.