首页 > 解决方案 > 带有 '=' 或 '!=' 运算符的数学风格表达式的正则表达式

问题描述

如果这个问题的标题不够准确,我提前道歉,我已经尽力用下面的例子和简短的解释来说明:

我正在尝试编写一个可以识别以下任何形式的表达式的正则表达式:

name=value

name!=value

name

!name

!name=value

!name!=value

我设计了遵循正则表达式,它工作得很好,除了第一个操作数(名称)以“!”开头时。

import re
expressionRe = re.compile( r"^(?P<name>[^=|^\!=]+)(?P<operator>(\!=|=*))(?P<value>.*)$" ) 

def showGroups( expr ):                                                                                             
   exprMatch = expressionRe.match( expr )                                                                                   
   if not exprMatch:                                                                                                
      print "no match"                                                                                             
   else:                 
      print "Name: {0}, operator: {1}, value {2}".\
         format( exprMatch.group('name'),
                 exprMatch.group('operator'),
                 exprMatch.group('value') )      

showGroups('abc!=')          
Name: abc, operator: !=, value:  

showGroups('.*=')            
Name: .*, operator: =, value:    

showGroups('.*=abc')         
Name: .*, operator: =, value: abc

showGroups('.*=val')         
Name: .*, operator: =, value: val

showGroups('=')  // this is expected
no match         

showGroups('!abc')  // this doesn't work :(
no match   

我意识到我已经让第一个捕获组不允许第一个操作数(名称)以“!”开头,但这是我可以证明所有其他情况正常工作的最接近的工作示例。

想知道是否有人可以帮助我完成最后一部分,让名称能够以“!”开头,而不会破坏运营商组可能以“!”开头 如果它后跟一个'='符号。

提前感谢您提供任何提示或建议。

标签: pythonregex

解决方案


您的否定字符[^=|^\!=]+集写入不正确。大多数元字符在字符集中写入时会失去其特殊含义。我想你想写一个匹配任何字符的表达式,除了写这个就足够了,而且因为=它不是正则表达式中的特殊字符,你不需要转义它,无论如何都不需要在字符集中转义,之后更正您更正的正则表达式如下。另外,我在组中捕获了可选地出现在行首的字符,你的最终正则表达式变成了这个,![^=!]!!notoperator

^(?P<notoperator>!)?(?P<name>[^=!\n]+)(?P<operator>(!?=))?(?P<value>.*)$

正则表达式演示


推荐阅读