python - 带有 '=' 或 '!=' 运算符的数学风格表达式的正则表达式
问题描述
如果这个问题的标题不够准确,我提前道歉,我已经尽力用下面的例子和简短的解释来说明:
我正在尝试编写一个可以识别以下任何形式的表达式的正则表达式:
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
我意识到我已经让第一个捕获组不允许第一个操作数(名称)以“!”开头,但这是我可以证明所有其他情况正常工作的最接近的工作示例。
想知道是否有人可以帮助我完成最后一部分,让名称能够以“!”开头,而不会破坏运营商组可能以“!”开头 如果它后跟一个'='符号。
提前感谢您提供任何提示或建议。
解决方案
您的否定字符[^=|^\!=]+
集写入不正确。大多数元字符在字符集中写入时会失去其特殊含义。我想你想写一个匹配任何字符的表达式,除了写这个就足够了,而且因为=
它不是正则表达式中的特殊字符,你不需要转义它,无论如何都不需要在字符集中转义,之后更正您更正的正则表达式如下。另外,我在组中捕获了可选地出现在行首的字符,你的最终正则表达式变成了这个,!
[^=!]
!
!
notoperator
^(?P<notoperator>!)?(?P<name>[^=!\n]+)(?P<operator>(!?=))?(?P<value>.*)$
推荐阅读
- bash - Bash如何在系统提示符下输入数据
- styled-components - 背景:使用 .attrs() 函数的 url()
- html - 如何对齐滑块、文本和值?
- django - Django 在事务中删除
- swift - PromiseKit,如何等待最终的承诺?
- python - 数字猜谜游戏 Python
- python-3.x - python递归避免结果作为全局变量
- javascript - ReactJS 使用 Ionic Uncaught TypeError:无法从 axios 请求中读取未定义的属性“映射”
- java - 并行流() java 1.8 与 11
- azure - azure datalake gen2 databricks ACL 权限