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) - 表からのデータの抽出」につづく…
0コメント:
コメントを投稿