将检查表达式的正则表达式是有效的算术表达式,例如' a + b * c = d'有效并被接受

时间:2017-08-22 18:08:53

标签: regex python-2.7

我为两者制作了单独的正则表达式,但它没有给出理想的结果。它应该像检查整个输入字符串一样工作,如果有效则返回有效,如果无效则返回无效。

import re
identifiers = r'^[^\d\W]\w*\Z'
operators = r'[\+\*\-\/=]'
a = re.compile(identifiers, re.UNICODE)
b = re.compile(operators, re.UNICODE)
c = re.findall(a, 'a+b*c=d')
d = re.findall(b, 'a+b*c=d')
print c, 'identifiers'
print d, 'operators'

此代码段的结果是

[ ] identifiers &
['+', '*', '='] operators

我希望输入字符串的结果有效或无效,方法是用正则表达式检查输入字符串的所有字符

2 个答案:

答案 0 :(得分:0)

对于像你的例子这样的简单情况,这样的表达式将起作用:

{{1}}

答案 1 :(得分:0)

我认为您使用当前代码时遇到的问题是,identifiers模式只有在匹配整个字符串时才有效。

问题是当前模式要求输入的开头和结尾都匹配(分别由^\Z匹配)。这通常会导致您找不到任何标识符,因为只有"foo"之类的输入才会匹配,因为它是一个单独的标识符,它接触字符串的开头和结尾。 (我还注意到将^\Z混合在一起有点奇怪,尽管它并非无效。将^与{{1}配对会更自然或$\Z。)

我怀疑您实际上并不想在您的模式中使用\A^,而应该使用\Z代替两者。 \b转义符与“单词分隔符”匹配,这意味着输入的开头或结尾,或者单词字符和非单词字符之间的变化。

\b

这仍然不会按照你最终想要的那样做(测试字符串是否确保它是一个有效的表达式)。这是一项更加困难的任务,正则表达式通常不符合它。某些特定形式的表达式也许可以与正则表达式匹配,但是像括号这样的支持将会匆忙打破整个系统。要识别任意算术表达式,你需要一个更复杂的解析器,它可能在其中的一些步骤中使用正则表达式,但不是整个步骤。