Python 带有'=';或者'=';操作人员

Python 带有'=';或者'=';操作人员,python,regex,Python,Regex,如果这个问题的标题不够准确,我提前表示歉意,我已经尽我所能用一个例子和下面的简短解释来说明: 我正在尝试编写一个正则表达式,该表达式可以识别以下任何形式的表达式: name=value name!=value name !name !name=value !name!=value 我设计了以下正则表达式,除了第一个操作数(名称)以“!”开头外,它工作得非常好 import re expressionRe = re.compile( r"^(?P<name>[^=|^\!=

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

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

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   
重新导入
expressionRe=re.compile(r“^(?P[^=|^\!=])+(?P(\!=|=*)(?P.*))
def显示组(expr):
exprMatch=expressionRe.match(expr)
如果不是EXPREMATCH:
打印“不匹配”
其他:
打印“名称:{0},运算符:{1},值{2}”\
格式(exprMatch.group('name'),
exprMatch.group('operator'),
exprMatch.group('value'))
showGroups('abc!='))
姓名:abc,操作员:!=,价值:
显示组('.*='))
名称:*,运算符:=,值:
显示组('.*=abc')
名称:*,运算符:=,值:abc
显示组('.*=val')
名称:*,运算符:=,值:val
showGroups('=')//这是预期的
没有对手
showGroups(“!abc”)//这不起作用:(
没有对手
我意识到我已经使第一个捕获组不允许第一个操作数(名称)以“!”开头,但这是我能得到的最接近的工作示例,可以演示所有其他情况是否正常工作

我想知道是否有人能帮我解决最后一个问题,让name能够以“!”开头,而不破坏操作符组,如果后面有“=”符号,则可以以“!”开头


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

尝试正则表达式:
^(?p!)?(?p[^=!]+)(?p!?=)?(?p(?尝试正则表达式:
^(?p!))(?p[^=!]+)(?p(?您的否定字符
[^=!!=)+
集合编写不正确。大多数元字符在字符集中编写时失去了其特殊意义。我认为您希望编写一个表达式,该表达式与任何字符都匹配,但编写此
[^=!]所针对的
=
除外
就足够了,而且由于
在正则表达式中不是一个特殊字符,您不需要转义它,也不需要在字符集中转义,更正后的正则表达式如下。此外,我还捕获了
组中的
字符,可选地出现在行首你最后的正则表达式是这样的

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

您的否定字符
[^=|^\!=]+
集写得不正确。大多数元字符在字符集中写入时会失去其特殊意义。我认为您希望编写一个表达式,该表达式与除
=
之外的任何字符都匹配,而编写此
[^=!]
就足够了,而且由于
在正则表达式中不是一个特殊字符,您不需要转义它,也不需要在字符集中转义,更正后的正则表达式如下。此外,我还捕获了
组中的
字符,可选地出现在行首你最后的正则表达式是这样的

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

谢谢@PushpeshKumarRajwanshi,我没有看那部分,因为我主要关注的是需求..我已经修正了..谢谢@PushpeshKumarRajwanshi,我没有看那部分,因为我主要关注的是需求..我已经修正了..我仍然以这种方式在第一个操作数的开头丢失了'!'.!name=值被解释为与name相同=value@bwrabbit:开始时,您想在哪里捕获
呢?在第四个命名组中,而不是在您已经拥有的三个命名组中?在您的帖子中的代码中,您似乎只对捕获
名称
运算符
值感兴趣。您想在哪里捕获
呢你一开始是
吗?在第四个名字组中会很理想,尽管这两个名字都适用于我的用例。再次感谢你的帮助,我感谢你的深刻反馈!@bwribit:当然,当然
可以在第四个组中捕获,我只是使用
*?
来匹配它,以便匹配你的字符串和意图y没有捕获任何组,因为在帖子中看到您当前的代码时,您似乎对捕获该组不感兴趣。让我更新我的正则表达式以捕获该组。@BWRATB:我已更新我的答案以捕获该组
到一个新组
notoperator
,现在只有
name
组是必需的,其余部分是可选的因此,只要名称组有要捕获的内容,任何示例都将匹配。此外,正如您在post中的示例一样,对于
=
,它应该说
不匹配
,因此它将不匹配,其余所有示例将匹配并打印组中捕获的正确输出。我仍然丢失第一个操作数t开头的“!”但是他的方式。例如!name=value被解释为与name相同=value@bwrabbit:您想从哪里开始捕获
在第四个命名组中,而不是在您已经拥有的三个命名组中?在您的帖子中的代码中,您似乎只对捕获
名称
运算符
感兴趣。其中您想一开始就捕获
吗?在第四个名称组中比较理想,尽管这两个名称都适用于我的用例。再次感谢您的帮助