如果这个问题的标题不够准确,我事先表示歉意,我已尽力通过下面的示例和简短说明来说明:
我正在尝试编写一个正则表达式,以标识以下任何形式的表达式:
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
我意识到我已经使第一个捕获组不允许第一个操作数(名称)以'!'开头,但这是我能证明所有其他情况正常工作的最接近的工作示例。
想知道是否有人可以帮助我解决最后一部分,而使名字能够以“!”开头,而不会破坏操作员组,那么可能以“!”开头。如果后跟一个'='符号。
在此先感谢您提供任何提示或建议。
答案 0 :(得分:1)
尝试使用正则表达式:^(?P<not>!)?(?P<name>[^=!]+)?(?P<operator>!?=)?(?P<value>(?<==).+)?$
答案 1 :(得分:1)
您设置的否定字符[^=|^\!=]+
书写不正确。当大多数元字符写在字符集中时,它们失去其特殊含义。我认为您想编写一个表达式,使其与=
和!
之外的任何字符匹配,为此,编写此[^=!]
就足够了,而且因为!
在正则表达式中不是特殊字符,则无需转义它,并且无论如何都不需要在字符集内转义,并且在更正后,您更正后的正则表达式将随之而来。另外,我已经捕获了!
组中的notoperator
个字符,该字符可选地出现在行的开头,您的最终正则表达式就是这个字符,
^(?P<notoperator>!)?(?P<name>[^=!\n]+)(?P<operator>(!?=))?(?P<value>.*)$