我需要替换类似 lisp 的代码中括号之间所有不必要的空格,如下所示:
(print (number->string ( (func? '+ '-) 12 13 14 15) ) )
这样就变成了:
(display (number->string ((func? '+ '-) 12 13 14 15)))
我知道乍一看它看起来非常简单,但它确实很棘手(至少对我来说)。这里是
我尝试过:
In [14]: re.sub(r"\)[ \t]*\)","))",")) ) ",0)
Out[14]: ')) ) '
In [15]: re.sub(r"\)[ \t]*\)","))",") ) ",0)
Out[15]: ')) '
In [16]: re.sub(r"\)[ \t]+\)","))",")) ) ",0)
Out[16]: '))) '
In [17]: re.sub(r"\)[ \t]+\)","))",")) ) ",0)
Out[17]: '))) '
In [18]: re.sub(r"\)[ \t]+\)","))",") ) ) ",0)
Out[18]: ')) ) '
In [19]: re.sub(r"\)[ \t]+\)","))",") ) ) ",1)
Out[19]: ')) ) '
In [20]: re.sub(r"\)[ \t]+\)","))",") ) ) ",0)
Out[20]: ')) ) '
In [21]: re.sub(r"\)[ \t]+\)","))",") ) ) ",0,re.M)
Out[21]: ')) ) '
In [22]: re.sub(r"\).+\)","))",") ) ) ",0,re.M)
Out[22]: ')) '
In [23]: re.sub(r"\)\s+\)","))",") ) ) ",0,re.M)
Out[23]: ')) ) '
In [24]: re.sub(r"\)([ \t]*)\)","))",") ) ",0)
Out[24]: ')) '
In [25]: re.sub(r"\)([ \t]*)\)","",") ) ",0)
Out[25]: ' '
In [26]: re.sub("\)([ \t]*)\)","))",") ) ",0)
Out[26]: ')) '
In [27]: re.sub("\)([ \t]*)\)","))",") ) )",0)
Out[27]: ')) )'
In [28]: re.sub("\)([ \t]*)\)","))",") ) )",0)
Out[28]: ')) )'
In [29]: re.sub("\)([ \t]*?)\)","))",") ) )",0)
Out[29]: ')) )'
In [30]: re.sub("\)(.+?)\)","))",") ) )",0)
Out[30]: ')) )'
在上述每种情况下,re.sub
仅替换第一个括号之间的空格,并使字符串的其余部分保持与之前相同的方式。我需要一个正则表达式来替换所有空格。
最佳答案
你的第一个替换已经“吃掉”了三个右括号中的两个;因此第二对(第二对和第三对)右括号不匹配。您会注意到,如果向示例文本添加第四个右括号,第二对之间的空格将被消除。
您必须在循环中替换(直到没有进行替换)或使用先行断言:
re.sub(r"\)[ \t]*(?=\))",")",") ) )",0)
它的作用是匹配 \)[\t]*
但只是“窥视”以检查是否有 \)
如下——这就是所谓的前瞻断言。 (还有后向断言,以及否定先行断言和后向断言。)
关于python - 在Python中使用正则表达式替换括号之间的所有空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276731/