代码之家  ›  专栏  ›  技术社区  ›  Tony Stark

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

  •  0
  • Tony Stark  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  0
  •   Blckknght    8 年前

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

    ^ \Z 分别)。这通常会导致您找不到任何标识符,因为只有像 "foo" \Z 虽然这不是无效的。配对会更自然 ^ $ 具有 \A

    我怀疑你其实不想 ^ \Z \b 转义匹配“分词”,即输入的开始或结束,或文字字符和非文字字符之间的变化。

    >>> re.findall(r'\b[^\d\W]\w*\b', 'a+b*c=d', re.U) 
    ['a', 'b', 'c', 'd']
    

    这仍然无法实现您最终想要的功能(测试字符串是否为有效表达式)。这是一项困难得多的任务,正则表达式通常无法胜任。某些特定形式的表达式可能可以与正则表达式匹配,但支持括号之类的东西会很快破坏整个系统。为了识别任意算术表达式,您需要一个更复杂的解析器,它可能在某些步骤中使用正则表达式,但不是在整个过程中。

        2
  •  0
  •   Michael    8 年前

    ^[0-9a-z]+([+/*-][0-9a-z]+)+=[0-9a-z]+$