試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Pythonでコマンド行のような文字列を解析してリストに格納する上でのメモ(前半)

文字列メソッドsplit()ではスペースを含んだダブルクォートされたまとまりを処理できない

Pythonの文字列オブジェクトにはsplit()というメンバ関数があり、文字列中の特定の文字を区切りとしてリストに分割することができるのだが、コマンド行のような文字列をスペースで分割してリストにしたい場合には都合が悪いことがある。例えば

cp "a b c.txt" "d e f.txt"

というコマンド行を解析してリストに分割することを考えると

  1. cp
  2. a b c.txt
  3. d e f.txt

という3つの要素を持ったリストになってほしいのだが、そのままsplit()で処理しようとすると

>>> 'cp "a b c.txt" "d e f.txt"'.split(' ')
['cp', '"a', 'b', 'c.txt"', '"d', 'e', 'f.txt"']

当然のことながら、途中で切れる。また、コマンドと引数の間に余分なスペースがあったりした場合にそれを無視するようにしたくても

>>> 'cp      "a b c.txt" "d e f.txt"'.split(' ')
['cp', '', '', '', '', '', '"a', 'b', 'c.txt"', '"d', 'e', 'f.txt"']

のように空文字列が途中に入ったりする。この連続スペースに関してはsplit()の引数を空かNoneにすると

>>> 'cp      "a b c.txt" "d e f.txt"'.split()
['cp', '"a', 'b', 'c.txt"', '"d', 'e', 'f.txt"']
>>> 'cp      "a b c.txt" "d e f.txt"'.split(None)
['cp', '"a', 'b', 'c.txt"', '"d', 'e', 'f.txt"']

うまく扱ってくれる(スペース以外の空白文字も対象となるなど、引数付きと挙動が変わる)が、ダブルクォートされた部分をひとまとめにすることはできない。

(「Pythonでコマンド行のような文字列を解析してリストに格納する上でのメモ(後半)」に続く)

関連記事:

使用したバージョン: