Logo address

正規表現

2007/10/13
2012/05/09 追加

正規表現を使って文字列のトリミングが可能か? Python と Lua で試してみる。

Python

もちろん

"^ *(.*) *$"
は巧く行かない。最長マッチングの規則のために
"  alice  bob  "
に適用すると "(.*)""alice bib " にマッチする。そこで正規表現を
"^ *(.*[^ ]) *$"
にすると "(.*[^ ])" は正しく
"alice  bob"
にマッチする。しかし空白だけの文字列の場合に長さ 0 の文字列にマッチさせたい場合にはどうするか?

この場合には

"^ *(.*[^ ]|) *$"
にすれば巧く行く。

以上の話の確認

import re
a="^ *(.*[^ ]|) *$"
c=re.compile(a)
s="  alice  bob  "
m=c.match(s)
print m.regs
s="      "
m=c.match(s)
print m.regs
この出力は
[(0, 14), (2, 12)]
[(0, 6), (6, 6)]
となる。

補足

Python 2.7 のマニュアルを見ると、最短マッチングが導入されている。どのバージョンからかは知らない。
それによると 「*」、「+」、「?」に続く「?」で最短マッチングを表す。これを使うと
"^ *(.*?) *$"
でトリミングができる。

Lua

2012/05/09

Lua では

match(s,"^%s*(.-)%s*$")
となる。ここの 「-」 は最短マッチングを表す。Lua の方がシンプルで僕の好みである。
(過去との互換性を破るけど...)
なお、「%s」は空白文字を表す。