文字列を空白で区切る

文字列を空白で区切ってリストに変換する, Haskell で言う words 的な処理が Python で必要になったので,書いてみた.

import re

def words(s):
  return re.findall( r"\S+", s )

words( "hoge fuga  \n  piyo" ) # ["hoge", "fuga", "piyo"]

正規表現さん素敵.


ここで終わりにしてもいいが,せっかくなので改良してみる.
まず,毎回 正規表現コンパイルするのは無駄なので,予めコンパイルしておく.

import re

word = re.compile(r"\S+")
def words(s):
  return word.findall( s )

ただし,この場合,グローバル変数 word を書き換えられると困る(もっとも, Pythonグローバル変数はファイルスコープな上に,関数内から書き換えるには予め global 指定を行う必要があるので,そんな状況は滅多に無いだろうが).
そこで word をローカルに落としこむことを考える. その為には関数生成用の関数を定義すればいい.

import re

def def_words():
  word = re.compile(r"\S+")
  global words
  def words(s):
    return word.findall( s )

def_words()
del def_words

これで,外から不意にグローバル変数を書き換えられて,妙なことになる可能性は消える.
その代わりに Pythonic さも消えた気がするが,特に気にすることはなかろう.

追記


というわけで,

def words(s):
  return s.split()

が Pythonic な書き方,ってことで FA .


…まぁ,こういうこともあるさね.