正则表达式重复重叠模式的贪婪

时间:2014-08-13 17:21:57

标签: python regex

我的目标:找到连续的二元/一元运算符并“校正”表达式中的间距。

示例:

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}}(识别为'-=')。

完整演示:

('-', '=')

如何控制捕获组的贪婪程度?

2 个答案:

答案 0 :(得分:1)

使用re.sub(pattern, substring, " ")

替换为单个空格

如果有任何测试用例失败,请告诉我

(?<=[\+\-\%\*\/])(?=[\+\-])|(?<==)(?! )|(?<=[^ \+\-\%\*\/=])(?=[\+\-\%\*\/]|[ ]+)

这是regex101 demo

模式说明:

  • (?<=[\+\-\%\*\/])(?=[\+\-])将与+, -, %, *, /后跟+-
  • 相匹配
  • (?<==)(?! )将匹配=,后跟无空格
  • (?<=[^ \+\-\%\*\/=])(?=[\+\-\%\*\/])将匹配非运算符后跟运算符
  • [ ]+将匹配一个或多个空格以用单个空格替换额外的空格

答案 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