我的目标:找到连续的二元/一元运算符并“校正”表达式中的间距。
示例:
a -=b => a -= b # Only one operator
a -=-b => a -= -b # Two consecutive operators
a +-b => a + -b # Two consecutive operators
etc.
我正在使用Python测试我的正则表达式,意图将其移植到Vim。
目前,我只需要弄清楚如何识别-=-
与-=
以及+-
:
我尝试了什么:
定义op = '[\-+=]=?'
或op = '-=|+|[\-\+=]'
适用于将'-=-'
识别为('-=', '-')
而将+-
识别为('+', '-')
,但它们不适用于{{ 1}}(识别为'-='
)。
完整演示:
('-', '=')
如何控制捕获组的贪婪程度?
答案 0 :(得分:1)
使用re.sub(pattern, substring, " ")
如果有任何测试用例失败,请告诉我
(?<=[\+\-\%\*\/])(?=[\+\-])|(?<==)(?! )|(?<=[^ \+\-\%\*\/=])(?=[\+\-\%\*\/]|[ ]+)
模式说明:
(?<=[\+\-\%\*\/])(?=[\+\-])
将与+, -, %, *, /
后跟+
或-
(?<==)(?! )
将匹配=
,后跟无空格(?<=[^ \+\-\%\*\/=])(?=[\+\-\%\*\/])
将匹配非运算符后跟运算符[ ]+
将匹配一个或多个空格以用单个空格替换额外的空格答案 1 :(得分:0)
试试这个:
re.sub(r'(\w+)\s*([+\-*/%|^&<>=]=?)([-+]?)\s*(\w+)', r'\1 \2 \3\4', 'expression here')
举个例子:
import re
print re.sub(r'(\w+)\s*([+\-*/%|^&<>=]=?)([-+]?)\s*(\w+)', r'\1 \2 \3\4', 'a -=-b')
print re.sub(r'(\w+)\s*([+\-*/%|^&<>=]=?)([-+]?)\s*(\w+)', r'\1 \2 \3\4', 'a -=b')
print re.sub(r'(\w+)\s*([+\-*/%|^&<>=]=?)([-+]?)\s*(\w+)', r'\1 \2 \3\4', 'a +-b')
输出:
a -= -b
a -= b
a + -b
您可以找到在线演示here。