使用'='或'!='运算符的数学样式表达式的正则表达式

时间:2019-04-26 18:48:47

标签: python regex

如果这个问题的标题不够准确,我事先表示歉意,我已尽力通过下面的示例和简短说明来说明:

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

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   

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

想知道是否有人可以帮助我解决最后一部分,而使名字能够以“!”开头,而不会破坏操作员组,那么可能以“!”开头。如果后跟一个'='符号。

在此先感谢您提供任何提示或建议。

2 个答案:

答案 0 :(得分:1)

尝试使用正则表达式:^(?P<not>!)?(?P<name>[^=!]+)?(?P<operator>!?=)?(?P<value>(?<==).+)?$

Demo

答案 1 :(得分:1)

您设置的否定字符[^=|^\!=]+书写不正确。当大多数元字符写在字符集中时,它们失去其特殊含义。我认为您想编写一个表达式,使其与=!之外的任何字符匹配,为此,编写此[^=!]就足够了,而且因为!在正则表达式中不是特殊字符,则无需转义它,并且无论如何都不需要在字符集内转义,并且在更正后,您更正后的正则表达式将随之而来。另外,我已经捕获了!组中的notoperator个字符,该字符可选地出现在行的开头,您的最终正则表达式就是这个字符,

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

Regex Demo