2008年5月29日木曜日

Python, Ruby で簡単なテキスト処理 (1) - 特定の単語が含む行を抽出する

1. 特定の単語が含む行を抽出したい

ちょっとしたテキストを加工しようと思う場合、 Ruby を使うことが多い。

例えば、テキストの中から特定の単語が含まれた列を抽出し、何らかの処理をしたいとする。

対象となるテキストは次のもの。

hoge
piyo
ほげほげ
ぴよぴよ
ほげ\nぴよ
10,20,30
100,200,300
  hoge  hoge
  piyo  piyo

 

2. Ruby の場合

ここから、「ほげ」を含む列を抽出する場合、次のように書く。

DATA.each do |line|
	puts line if line =~ /ほげ/
end

__END__
ここに対象のテキストを貼り付ける。

Ruby では、

__END__

以降にあるテキストを読み込んで処理できるので、軽く試したいときに便利。

 

3. Python の場合

まずは、Ruby の __END__ と同じような機能が Python にもないかと探した。

スクリプト言語の比較::__END__ によると、

ない。ただし各モジュール、クラス、関数の最初に記述するドキュメント文字列中に、利用例としてテストケースを記述し、自動テストを実施するdoctestという仕組みがある。

パタッ(o_ _)o~†

スクリプト系の言語なら、同じような記述ができると思ったのが甘かった。 ^^; どうするのが一番楽ができるのだろうか?

とりあえず、変数に対象の文字列を代入して、処理するという形にしてみる。

lines = ur"""ここに対象のテキストを貼り付ける
"""

import re

for line in lines.split('\n'):
    if re.search(ur"ほげ", line):
        print line

文字列の前の ur は、2.4.1 String literals によると、

String literals may optionally be prefixed with a letter "r" or "R"; such strings are called raw strings and use different rules for interpreting backslash escape sequences. A prefix of "u" or "U" makes the string a Unicode string.

Unicode であり、raw string であることを示している。

r を付けたのは、対象のテキストの中に、 \n が含まれるため。 r を付けないと、対象のテキスト中にある \n が「改行」と解釈されてしまう。

それにしても、正規表現を使うだけで、モジュールをインポートしないといけないのは面倒。Ruby のように

 /正規表現/

のように書けないのだろうか... (@_@;)

 

覚え方

ur と re.search を使うことを、記憶しておくには、どうするか?

「裏リサーチ」

と覚えておくことにしよう。

追記(2008/6/3): Windows xp 上で、Python 2.5 を利用している。上記の lines 変数に代入した対象のテキストに「タブや空白」があると、 print 文でなぜか余分な空白行が出力されてしまう。そこで、改行コードを LF (UNIX) にしたら、普通に表示された。 なぜだろう (?_?)

それから、コード上で文字列を分割している split() だと、タブでも分割されてしまうので、 split('\n') に変更した。

Python, Ruby で簡単なテキスト処理 (2) - 表からのデータの抽出」につづく…

 

4. 参考