1

次のような 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、最初の大括弧の間の空白のみを置き換え、残りの文字列は以前と同じ方法のままにします。すべての空白を置き換えるには正規表現が必要です。

4

1 に答える 1