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:您想从哪里开始捕获!
在第四个命名组中,而不是在您已经拥有的三个命名组中?在您的帖子中的代码中,您似乎只对捕获名称
、运算符
和值
感兴趣。其中您想一开始就捕获!
吗?在第四个名称组中比较理想,尽管这两个名称都适用于我的用例。再次感谢您的帮助