Python-只允许特定的单词(变量)和数学运算符作为输入
python中验证字符串的最佳方法是什么,以便它只包含特定的(预定义的)单词或一些其他字符[例如+,-,/,*,(,)] 我的最终目标是验证输入(字符串将用作数学公式),例如:Python-只允许特定的单词(变量)和数学运算符作为输入,python,regex,validation,Python,Regex,Validation,python中验证字符串的最佳方法是什么,以便它只包含特定的(预定义的)单词或一些其他字符[例如+,-,/,*,(,)] 我的最终目标是验证输入(字符串将用作数学公式),例如: foo = Valid fooo = Invalid bar = Valid foo/(bar+foo) = Valid foo*bar - foo = Valid foo + tree = Invalid + = Invalid 我一直在寻找并发现类似的问题,但似乎没有一个完全符合我的需要。 我已经设法创建了一个有
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
我还试图使用
如果不重新匹配=(“(\b(?=foo\b | bar\b |\d++\b)\w++\b)|\s |[*/+()-]”,输入_str)
这似乎在这里起了作用:(但我怀疑重新匹配不是正确的方式……)
有人能告诉我实现目标的最佳方法吗?谢谢 这就是规范的词法分析和解析问题:如何将字符串识别为有效标记并解释它们是否有效 涉及正则表达式,但不是以您认为的方式:当您有一个形式语法来匹配时,正则表达式本身通常是不够的(您可以这样做,否则简单地拥有一个没有操作数的
+
,将被认为是有效的)
是一个用Python编写的解析器lexer,它本质上是Lex和Yacc的一个端口。它将在解决这个问题时减轻很多负担,并且只需要很少的代码就可以完成
您的语法基本上是计算器语法,只需进行简单修改(以下是Brackus-Naur格式):
表达式:表达式+术语
|表达式-术语
|术语
术语:术语*系数
|术语/系数
|因素
因子:标识符
|(表达)
其中IDENTIFIER
可以表示您想要的任何有效单词。您甚至可以更进一步,将标识符
替换为您希望它解析的特定单词。我链接到的PLY页面提供了一个关于如何实现这一点的完整教程,包括完整的代码
对于lexer,您只需要指定与令牌匹配的各个正则表达式。换句话说,您只需要告诉lexer将所有看起来像
+
的字符串标记为加号,而不是这些字符的所有可能组合。这节省了很多麻烦:不再只有一个正则表达式匹配整个字符串,只有一个正则表达式来标识字符串的每个部分。同样,PLY文档详尽地介绍了这一点 这就是规范的词法分析和解析问题:如何将字符串识别为有效标记并解释它们是否有效
涉及正则表达式,但不是以您认为的方式:当您有一个形式语法来匹配时,正则表达式本身通常是不够的(您可以这样做,否则简单地拥有一个没有操作数的+
,将被认为是有效的)
是一个用Python编写的解析器lexer,它本质上是Lex和Yacc的一个端口。它将在解决这个问题时减轻很多负担,并且只需要很少的代码就可以完成
您的语法基本上是计算器语法,只需进行简单修改(以下是Brackus-Naur格式):
表达式:表达式+术语
|表达式-术语
|术语
术语:术语*系数
|术语/系数
|因素
因子:标识符
|(表达)
其中IDENTIFIER
可以表示您想要的任何有效单词。您甚至可以更进一步,将标识符
替换为您希望它解析的特定单词。我链接到的PLY页面提供了一个关于如何实现这一点的完整教程,包括完整的代码
对于lexer,您只需要指定与令牌匹配的各个正则表达式。换句话说,您只需要告诉lexer将所有看起来像+
的字符串标记为加号,而不是这些字符的所有可能组合。这节省了很多麻烦:不再只有一个正则表达式匹配整个字符串,只有一个正则表达式来标识字符串的每个部分。同样,PLY文档详尽地介绍了这一点 我同意莱昂戈尔德所说的一切。但让我们假设您的需求只是您明确声明的:
在python中,验证字符串的最佳方法是什么,以使其
是否包含特定(预定义)单词或其他字符
然后稍微调整一下正则表达式就可以满足它:
^([\s*\/+()-]*(?=foo\b|bar\b|\d+\b)\w+[\s*\/+()-]*)+$
(我去掉了模式末尾的|\s |[*/+()-]
,将该逻辑移到括号中,同时还考虑了前导运算符,然后量化了整个结构:
(运算符/空格专用词运算符/空格),其中一个或多个由^
和$
锚定,以确保整行必须匹配
旁白:您也不需要“吃掉”边界,因为它们是零宽度的,并且您不消耗任何东西
我同意莱昂戈尔德所说的一切。但让我们假设一下,您的要求只是您明确说明的:
在python中,验证字符串的最佳方法是什么,以使其
是否包含特定(预定义)单词或其他字符
然后稍微调整一下正则表达式就可以满足它:
^([\s*\/+()-]*(?=foo\b|bar\b|\d+\b)\w+[\s*\/+()-]*)+$
(我去掉了模式末尾的|\s |[*/+()-]
,将该逻辑移到括号中,同时还考虑了前导运算符,然后量化了整个结构:
(运算符/空格专用词运算符/空格),其中一个或多个由^
和$
锚定,以确保整行必须匹配
旁白:你也是