読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

pythonの正規表現でハマった件

Python

スポンサードリンク

またハマった。。。
そろそろハマったシリーズ作ろうかな?


今度は正規表現です。
正規表現で、置換や文字列削除などで
オススメの言語はPerlです。


なんて言ったって、書きやすいこの上無し。
他の言語はコンパイルだったり、手続きが多いのでちっと面倒くさい。


でも、今回はPython上で利用したかったので、Python
re.sub() でやろうとしたのね。そしたらね。


4時間もバトルするハメに・・・(´・ω・)ナゼデショウ?


例えばこういうhtmlソースがあったとします。

<li>Apple</li>
<li>Orange</li>
<li>Meron</li>
<li>Grape</li>
<li>Cherry</li>


で、正規表現を使って、タグだけとりはずしたいのね。

「re」モジュールをインポートして、「re.sub」で置換します。
「re.compile」からでもよかったですが、ちっと面倒なので、「re.sub」を使いました。

import re

# 変数「html」はどこかのサイトからソースを取得済みだとします。
li_tag = html.read()

result = re.sub('<li>(.+?)<\/li>', '', li_tag)
# result -> ''
print result


でも、これじゃ、置換は全削除となります。
結果はタグを除去した間のテキストがほしい。

先程の正規表現はグループ化しているので
「<li>(.+?)<\/li>」を「$1」に置換すれば良い。

そして、Pythonだと「$1」の記述は「\1」となります。
では、書き直します。

ちなみに下記、説明サイトから引用(7.2. re — 正規表現操作

(...)
丸括弧の中にどのような正規表現があってもマッチし、またグループの先頭と末尾を表します;グループの中身は、マッチが実行された後に検索され、後述する \number 特殊シーケンス付きの文字列内で、後でマッチされます。文字通りの '(' や ')' とマッチするには、 \( あるいは \) を使うか、それらを文字クラス内に入れます: [(] [)] 。

import re

# 変数「html」はどこかのサイトからソースを取得済みだとします。
li_tag = html.read()

result = re.sub('<li>(.+?)<\/li>', '\1', li_tag)
# result -> ''
print result


あり?
でてこないお(´・ω・)?


さーて、ここからたくさんの情報を閲覧しました。
しかし、一向にできる気がしません。


4時間バトりました!4時間!orz
で、結果できたんですけど、下記に変更(;ω; )

import re

# 変数「html」はどこかのサイトからソースを取得済みだとします。
li_tag = html.read()

result = re.sub('<li>(.+?)<\/li>', '\\1', li_tag)
# result -> 'appleorange...'
print result


わかりやすいようにぴっくあっぷ

'\1' -> '\\1'


なん・・・・だと・・・!?
こん・・・・だけ・・・だと・・・!!?

f:id:aipacommander:20140617183601g:plain

うがぁああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ


f:id:aipacommander:20140617183616j:plain
うわぁああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ


f:id:aipacommander:20140617183626p:plain
クリリンのことかぁああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ


(;ω;)ツカレタオ


おわり