Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-只允许特定的单词(变量)和数学运算符作为输入_Python_Regex_Validation - Fatal编程技术网

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 我一直在寻找并发现类似的问题,但似乎没有一个完全符合我的需要。 我已经设法创建了一个有

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 
我还试图使用

如果不重新匹配=(“(\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 |[*/+()-]
,将该逻辑移到括号中,同时还考虑了前导运算符,然后量化了整个结构:

(运算符/空格专用词运算符/空格),其中一个或多个由
^
$
锚定,以确保整行必须匹配

旁白:你也是